|
@@ -3212,7 +3212,7 @@ static void update_balance_args(struct btrfs_balance_control *bctl)
|
|
|
/*
|
|
/*
|
|
|
* Should be called with both balance and volume mutexes held to
|
|
* Should be called with both balance and volume mutexes held to
|
|
|
* serialize other volume operations (add_dev/rm_dev/resize) with
|
|
* serialize other volume operations (add_dev/rm_dev/resize) with
|
|
|
- * restriper. Same goes for unset_balance_control.
|
|
|
|
|
|
|
+ * restriper. Same goes for reset_balance_state.
|
|
|
*/
|
|
*/
|
|
|
static void set_balance_control(struct btrfs_balance_control *bctl)
|
|
static void set_balance_control(struct btrfs_balance_control *bctl)
|
|
|
{
|
|
{
|
|
@@ -3225,9 +3225,13 @@ static void set_balance_control(struct btrfs_balance_control *bctl)
|
|
|
spin_unlock(&fs_info->balance_lock);
|
|
spin_unlock(&fs_info->balance_lock);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-static void unset_balance_control(struct btrfs_fs_info *fs_info)
|
|
|
|
|
|
|
+/*
|
|
|
|
|
+ * Clear the balance status in fs_info and delete the balance item from disk.
|
|
|
|
|
+ */
|
|
|
|
|
+static void reset_balance_state(struct btrfs_fs_info *fs_info)
|
|
|
{
|
|
{
|
|
|
struct btrfs_balance_control *bctl = fs_info->balance_ctl;
|
|
struct btrfs_balance_control *bctl = fs_info->balance_ctl;
|
|
|
|
|
+ int ret;
|
|
|
|
|
|
|
|
BUG_ON(!fs_info->balance_ctl);
|
|
BUG_ON(!fs_info->balance_ctl);
|
|
|
|
|
|
|
@@ -3236,6 +3240,9 @@ static void unset_balance_control(struct btrfs_fs_info *fs_info)
|
|
|
spin_unlock(&fs_info->balance_lock);
|
|
spin_unlock(&fs_info->balance_lock);
|
|
|
|
|
|
|
|
kfree(bctl);
|
|
kfree(bctl);
|
|
|
|
|
+ ret = del_balance_item(fs_info);
|
|
|
|
|
+ if (ret)
|
|
|
|
|
+ btrfs_handle_fs_error(fs_info, ret, NULL);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -3772,16 +3779,6 @@ static inline int balance_need_close(struct btrfs_fs_info *fs_info)
|
|
|
atomic_read(&fs_info->balance_cancel_req) == 0);
|
|
atomic_read(&fs_info->balance_cancel_req) == 0);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-static void __cancel_balance(struct btrfs_fs_info *fs_info)
|
|
|
|
|
-{
|
|
|
|
|
- int ret;
|
|
|
|
|
-
|
|
|
|
|
- unset_balance_control(fs_info);
|
|
|
|
|
- ret = del_balance_item(fs_info);
|
|
|
|
|
- if (ret)
|
|
|
|
|
- btrfs_handle_fs_error(fs_info, ret, NULL);
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
/* Non-zero return value signifies invalidity */
|
|
/* Non-zero return value signifies invalidity */
|
|
|
static inline int validate_convert_profile(struct btrfs_balance_args *bctl_arg,
|
|
static inline int validate_convert_profile(struct btrfs_balance_args *bctl_arg,
|
|
|
u64 allowed)
|
|
u64 allowed)
|
|
@@ -3936,7 +3933,7 @@ int btrfs_balance(struct btrfs_balance_control *bctl,
|
|
|
|
|
|
|
|
if ((ret && ret != -ECANCELED && ret != -ENOSPC) ||
|
|
if ((ret && ret != -ECANCELED && ret != -ENOSPC) ||
|
|
|
balance_need_close(fs_info)) {
|
|
balance_need_close(fs_info)) {
|
|
|
- __cancel_balance(fs_info);
|
|
|
|
|
|
|
+ reset_balance_state(fs_info);
|
|
|
clear_bit(BTRFS_FS_EXCL_OP, &fs_info->flags);
|
|
clear_bit(BTRFS_FS_EXCL_OP, &fs_info->flags);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -3945,7 +3942,7 @@ int btrfs_balance(struct btrfs_balance_control *bctl,
|
|
|
return ret;
|
|
return ret;
|
|
|
out:
|
|
out:
|
|
|
if (bctl->flags & BTRFS_BALANCE_RESUME)
|
|
if (bctl->flags & BTRFS_BALANCE_RESUME)
|
|
|
- __cancel_balance(fs_info);
|
|
|
|
|
|
|
+ reset_balance_state(fs_info);
|
|
|
else
|
|
else
|
|
|
kfree(bctl);
|
|
kfree(bctl);
|
|
|
clear_bit(BTRFS_FS_EXCL_OP, &fs_info->flags);
|
|
clear_bit(BTRFS_FS_EXCL_OP, &fs_info->flags);
|
|
@@ -4124,13 +4121,13 @@ int btrfs_cancel_balance(struct btrfs_fs_info *fs_info)
|
|
|
atomic_read(&fs_info->balance_running) == 0);
|
|
atomic_read(&fs_info->balance_running) == 0);
|
|
|
mutex_lock(&fs_info->balance_mutex);
|
|
mutex_lock(&fs_info->balance_mutex);
|
|
|
} else {
|
|
} else {
|
|
|
- /* __cancel_balance needs volume_mutex */
|
|
|
|
|
|
|
+ /* reset_balance_state needs volume_mutex */
|
|
|
mutex_unlock(&fs_info->balance_mutex);
|
|
mutex_unlock(&fs_info->balance_mutex);
|
|
|
mutex_lock(&fs_info->volume_mutex);
|
|
mutex_lock(&fs_info->volume_mutex);
|
|
|
mutex_lock(&fs_info->balance_mutex);
|
|
mutex_lock(&fs_info->balance_mutex);
|
|
|
|
|
|
|
|
if (fs_info->balance_ctl) {
|
|
if (fs_info->balance_ctl) {
|
|
|
- __cancel_balance(fs_info);
|
|
|
|
|
|
|
+ reset_balance_state(fs_info);
|
|
|
clear_bit(BTRFS_FS_EXCL_OP, &fs_info->flags);
|
|
clear_bit(BTRFS_FS_EXCL_OP, &fs_info->flags);
|
|
|
}
|
|
}
|
|
|
|
|
|