Unverified Commit 0f104c99 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!12208 Some bugfixs for ubi/fs

Merge Pull Request from: @ci-robot 
 
PR sync from: Zhihao Cheng <chengzhihao@huaweicloud.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/IHTCHV3P2NHFXVTFJTZHB6KR4PBMPSHU/ 
From: Zhihao Cheng <chengzhihao1@huawei.com>

Amir Goldstein (1):
  locks: fix TOCTOU race when granting write lease

Li Nan (1):
  ubi: block: fix null-pointer-dereference in ubiblock_create()

Li zeming (1):
  ubi: block: Remove in vain semicolon


-- 
2.39.2
 
https://gitee.com/openeuler/kernel/issues/IAWXV9 
 
Link:https://gitee.com/openeuler/kernel/pulls/12208

 

Reviewed-by: default avatarYang Yingliang <yangyingliang@huawei.com>
Signed-off-by: default avatarYang Yingliang <yangyingliang@huawei.com>
parents f39c1271 cbd140b7
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -404,8 +404,9 @@ int ubiblock_create(struct ubi_volume_info *vi)

	ret = blk_mq_alloc_tag_set(&dev->tag_set);
	if (ret) {
		dev_err(disk_to_dev(dev->gd), "blk_mq_alloc_tag_set failed");
		goto out_free_dev;;
		pr_err("ubiblock%d_%d: blk_mq_alloc_tag_set failed\n",
			dev->ubi_num, dev->vol_id);
		goto out_free_dev;
	}


@@ -421,8 +422,8 @@ int ubiblock_create(struct ubi_volume_info *vi)
	gd->minors = 1;
	gd->first_minor = idr_alloc(&ubiblock_minor_idr, dev, 0, 0, GFP_KERNEL);
	if (gd->first_minor < 0) {
		dev_err(disk_to_dev(gd),
			"block: dynamic minor allocation failed");
		pr_err("ubiblock%d_%d: block: dynamic minor allocation failed\n",
			dev->ubi_num, dev->vol_id);
		ret = -ENODEV;
		goto out_cleanup_disk;
	}
+1 −6
Original line number Diff line number Diff line
@@ -316,12 +316,7 @@ static void __fput(struct file *file)
	}
	fops_put(file->f_op);
	put_pid(file->f_owner.pid);
	if ((mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ)
		i_readcount_dec(inode);
	if (mode & FMODE_WRITER) {
		put_write_access(inode);
		__mnt_drop_write(mnt);
	}
	put_file_access(file);
	dput(dentry);
	if (unlikely(mode & FMODE_NEED_UNMOUNT))
		dissolve_on_fput(mnt);
+10 −0
Original line number Diff line number Diff line
@@ -110,6 +110,16 @@ extern void chroot_fs_refs(const struct path *, const struct path *);
extern struct file *alloc_empty_file(int, const struct cred *);
extern struct file *alloc_empty_file_noaccount(int, const struct cred *);

static inline void put_file_access(struct file *file)
{
	if ((file->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) {
		i_readcount_dec(file->f_inode);
	} else if (file->f_mode & FMODE_WRITER) {
		put_write_access(file->f_inode);
		__mnt_drop_write(file->f_path.mnt);
	}
}

/*
 * super.c
 */
+4 −7
Original line number Diff line number Diff line
@@ -779,7 +779,9 @@ static int do_dentry_open(struct file *f,
		return 0;
	}

	if (f->f_mode & FMODE_WRITE && !special_file(inode->i_mode)) {
	if ((f->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) {
		i_readcount_inc(inode);
	} else if (f->f_mode & FMODE_WRITE && !special_file(inode->i_mode)) {
		error = get_write_access(inode);
		if (unlikely(error))
			goto cleanup_file;
@@ -819,8 +821,6 @@ static int do_dentry_open(struct file *f,
			goto cleanup_all;
	}
	f->f_mode |= FMODE_OPENED;
	if ((f->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ)
		i_readcount_inc(inode);
	if ((f->f_mode & FMODE_READ) &&
	     likely(f->f_op->read || f->f_op->read_iter))
		f->f_mode |= FMODE_CAN_READ;
@@ -852,10 +852,7 @@ static int do_dentry_open(struct file *f,
	if (WARN_ON_ONCE(error > 0))
		error = -EINVAL;
	fops_put(f->f_op);
	if (f->f_mode & FMODE_WRITER) {
		put_write_access(inode);
		__mnt_drop_write(f->f_path.mnt);
	}
	put_file_access(f);
cleanup_file:
	path_put(&f->f_path);
	f->f_path.mnt = NULL;