|
@@ -1504,7 +1504,7 @@ static noinline int btrfs_ioctl_resize(struct file *file,
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
- if (atomic_xchg(&fs_info->mutually_exclusive_operation_running, 1)) {
|
|
|
+ if (test_and_set_bit(BTRFS_FS_EXCL_OP, &fs_info->flags)) {
|
|
|
mnt_drop_write_file(file);
|
|
|
return BTRFS_ERROR_DEV_EXCL_RUN_IN_PROGRESS;
|
|
|
}
|
|
@@ -1619,7 +1619,7 @@ out_free:
|
|
|
kfree(vol_args);
|
|
|
out:
|
|
|
mutex_unlock(&fs_info->volume_mutex);
|
|
|
- atomic_set(&fs_info->mutually_exclusive_operation_running, 0);
|
|
|
+ clear_bit(BTRFS_FS_EXCL_OP, &fs_info->flags);
|
|
|
mnt_drop_write_file(file);
|
|
|
return ret;
|
|
|
}
|
|
@@ -2661,7 +2661,7 @@ static long btrfs_ioctl_add_dev(struct btrfs_fs_info *fs_info, void __user *arg)
|
|
|
if (!capable(CAP_SYS_ADMIN))
|
|
|
return -EPERM;
|
|
|
|
|
|
- if (atomic_xchg(&fs_info->mutually_exclusive_operation_running, 1))
|
|
|
+ if (test_and_set_bit(BTRFS_FS_EXCL_OP, &fs_info->flags))
|
|
|
return BTRFS_ERROR_DEV_EXCL_RUN_IN_PROGRESS;
|
|
|
|
|
|
mutex_lock(&fs_info->volume_mutex);
|
|
@@ -2680,7 +2680,7 @@ static long btrfs_ioctl_add_dev(struct btrfs_fs_info *fs_info, void __user *arg)
|
|
|
kfree(vol_args);
|
|
|
out:
|
|
|
mutex_unlock(&fs_info->volume_mutex);
|
|
|
- atomic_set(&fs_info->mutually_exclusive_operation_running, 0);
|
|
|
+ clear_bit(BTRFS_FS_EXCL_OP, &fs_info->flags);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -2708,7 +2708,7 @@ static long btrfs_ioctl_rm_dev_v2(struct file *file, void __user *arg)
|
|
|
if (vol_args->flags & ~BTRFS_VOL_ARG_V2_FLAGS_SUPPORTED)
|
|
|
return -EOPNOTSUPP;
|
|
|
|
|
|
- if (atomic_xchg(&fs_info->mutually_exclusive_operation_running, 1)) {
|
|
|
+ if (test_and_set_bit(BTRFS_FS_EXCL_OP, &fs_info->flags)) {
|
|
|
ret = BTRFS_ERROR_DEV_EXCL_RUN_IN_PROGRESS;
|
|
|
goto out;
|
|
|
}
|
|
@@ -2721,7 +2721,7 @@ static long btrfs_ioctl_rm_dev_v2(struct file *file, void __user *arg)
|
|
|
ret = btrfs_rm_device(fs_info, vol_args->name, 0);
|
|
|
}
|
|
|
mutex_unlock(&fs_info->volume_mutex);
|
|
|
- atomic_set(&fs_info->mutually_exclusive_operation_running, 0);
|
|
|
+ clear_bit(BTRFS_FS_EXCL_OP, &fs_info->flags);
|
|
|
|
|
|
if (!ret) {
|
|
|
if (vol_args->flags & BTRFS_DEVICE_SPEC_BY_ID)
|
|
@@ -2752,7 +2752,7 @@ static long btrfs_ioctl_rm_dev(struct file *file, void __user *arg)
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
- if (atomic_xchg(&fs_info->mutually_exclusive_operation_running, 1)) {
|
|
|
+ if (test_and_set_bit(BTRFS_FS_EXCL_OP, &fs_info->flags)) {
|
|
|
ret = BTRFS_ERROR_DEV_EXCL_RUN_IN_PROGRESS;
|
|
|
goto out_drop_write;
|
|
|
}
|
|
@@ -2772,7 +2772,7 @@ static long btrfs_ioctl_rm_dev(struct file *file, void __user *arg)
|
|
|
btrfs_info(fs_info, "disk deleted %s", vol_args->name);
|
|
|
kfree(vol_args);
|
|
|
out:
|
|
|
- atomic_set(&fs_info->mutually_exclusive_operation_running, 0);
|
|
|
+ clear_bit(BTRFS_FS_EXCL_OP, &fs_info->flags);
|
|
|
out_drop_write:
|
|
|
mnt_drop_write_file(file);
|
|
|
|
|
@@ -4442,13 +4442,11 @@ static long btrfs_ioctl_dev_replace(struct btrfs_fs_info *fs_info,
|
|
|
ret = -EROFS;
|
|
|
goto out;
|
|
|
}
|
|
|
- if (atomic_xchg(
|
|
|
- &fs_info->mutually_exclusive_operation_running, 1)) {
|
|
|
+ if (test_and_set_bit(BTRFS_FS_EXCL_OP, &fs_info->flags)) {
|
|
|
ret = BTRFS_ERROR_DEV_EXCL_RUN_IN_PROGRESS;
|
|
|
} else {
|
|
|
ret = btrfs_dev_replace_by_ioctl(fs_info, p);
|
|
|
- atomic_set(
|
|
|
- &fs_info->mutually_exclusive_operation_running, 0);
|
|
|
+ clear_bit(BTRFS_FS_EXCL_OP, &fs_info->flags);
|
|
|
}
|
|
|
break;
|
|
|
case BTRFS_IOCTL_DEV_REPLACE_CMD_STATUS:
|
|
@@ -4643,7 +4641,7 @@ static long btrfs_ioctl_balance(struct file *file, void __user *arg)
|
|
|
return ret;
|
|
|
|
|
|
again:
|
|
|
- if (!atomic_xchg(&fs_info->mutually_exclusive_operation_running, 1)) {
|
|
|
+ if (!test_and_set_bit(BTRFS_FS_EXCL_OP, &fs_info->flags)) {
|
|
|
mutex_lock(&fs_info->volume_mutex);
|
|
|
mutex_lock(&fs_info->balance_mutex);
|
|
|
need_unlock = true;
|
|
@@ -4689,7 +4687,7 @@ again:
|
|
|
}
|
|
|
|
|
|
locked:
|
|
|
- BUG_ON(!atomic_read(&fs_info->mutually_exclusive_operation_running));
|
|
|
+ BUG_ON(!test_bit(BTRFS_FS_EXCL_OP, &fs_info->flags));
|
|
|
|
|
|
if (arg) {
|
|
|
bargs = memdup_user(arg, sizeof(*bargs));
|
|
@@ -4745,11 +4743,10 @@ locked:
|
|
|
|
|
|
do_balance:
|
|
|
/*
|
|
|
- * Ownership of bctl and mutually_exclusive_operation_running
|
|
|
+ * Ownership of bctl and filesystem flag BTRFS_FS_EXCL_OP
|
|
|
* goes to to btrfs_balance. bctl is freed in __cancel_balance,
|
|
|
* or, if restriper was paused all the way until unmount, in
|
|
|
- * free_fs_info. mutually_exclusive_operation_running is
|
|
|
- * cleared in __cancel_balance.
|
|
|
+ * free_fs_info. The flag is cleared in __cancel_balance.
|
|
|
*/
|
|
|
need_unlock = false;
|
|
|
|
|
@@ -4769,7 +4766,7 @@ out_unlock:
|
|
|
mutex_unlock(&fs_info->balance_mutex);
|
|
|
mutex_unlock(&fs_info->volume_mutex);
|
|
|
if (need_unlock)
|
|
|
- atomic_set(&fs_info->mutually_exclusive_operation_running, 0);
|
|
|
+ clear_bit(BTRFS_FS_EXCL_OP, &fs_info->flags);
|
|
|
out:
|
|
|
mnt_drop_write_file(file);
|
|
|
return ret;
|