Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 25122d15 authored by Ilya Dryomov's avatar Ilya Dryomov
Browse files

Btrfs: reorder locks and sanity checks in btrfs_ioctl_defrag



Operation-specific check (whether subvol is readonly or not) should go
after the mutual exclusiveness check.

Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent 4ac20c70
Loading
Loading
Loading
Loading
+9 −8
Original line number Diff line number Diff line
@@ -2186,19 +2186,20 @@ static int btrfs_ioctl_defrag(struct file *file, void __user *argp)
	struct btrfs_ioctl_defrag_range_args *range;
	int ret;

	if (btrfs_root_readonly(root))
		return -EROFS;
	ret = mnt_want_write_file(file);
	if (ret)
		return ret;

	if (atomic_xchg(&root->fs_info->mutually_exclusive_operation_running,
			1)) {
		pr_info("btrfs: dev add/delete/balance/replace/resize operation in progress\n");
		mnt_drop_write_file(file);
		return -EINVAL;
	}
	ret = mnt_want_write_file(file);
	if (ret) {
		atomic_set(&root->fs_info->mutually_exclusive_operation_running,
			   0);
		return ret;

	if (btrfs_root_readonly(root)) {
		ret = -EROFS;
		goto out;
	}

	switch (inode->i_mode & S_IFMT) {
@@ -2250,8 +2251,8 @@ static int btrfs_ioctl_defrag(struct file *file, void __user *argp)
		ret = -EINVAL;
	}
out:
	mnt_drop_write_file(file);
	atomic_set(&root->fs_info->mutually_exclusive_operation_running, 0);
	mnt_drop_write_file(file);
	return ret;
}