diff options
Diffstat (limited to 'fs/btrfs/volumes.c')
-rw-r--r-- | fs/btrfs/volumes.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 35bb2d4ed29f..6b9cff42265d 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
@@ -2379,7 +2379,11 @@ static int btrfs_relocate_chunk(struct btrfs_root *root, | |||
2379 | return ret; | 2379 | return ret; |
2380 | 2380 | ||
2381 | trans = btrfs_start_transaction(root, 0); | 2381 | trans = btrfs_start_transaction(root, 0); |
2382 | BUG_ON(IS_ERR(trans)); | 2382 | if (IS_ERR(trans)) { |
2383 | ret = PTR_ERR(trans); | ||
2384 | btrfs_std_error(root->fs_info, ret); | ||
2385 | return ret; | ||
2386 | } | ||
2383 | 2387 | ||
2384 | lock_chunks(root); | 2388 | lock_chunks(root); |
2385 | 2389 | ||
@@ -3050,7 +3054,8 @@ static void __cancel_balance(struct btrfs_fs_info *fs_info) | |||
3050 | 3054 | ||
3051 | unset_balance_control(fs_info); | 3055 | unset_balance_control(fs_info); |
3052 | ret = del_balance_item(fs_info->tree_root); | 3056 | ret = del_balance_item(fs_info->tree_root); |
3053 | BUG_ON(ret); | 3057 | if (ret) |
3058 | btrfs_std_error(fs_info, ret); | ||
3054 | 3059 | ||
3055 | atomic_set(&fs_info->mutually_exclusive_operation_running, 0); | 3060 | atomic_set(&fs_info->mutually_exclusive_operation_running, 0); |
3056 | } | 3061 | } |
@@ -3230,6 +3235,11 @@ int btrfs_balance(struct btrfs_balance_control *bctl, | |||
3230 | update_ioctl_balance_args(fs_info, 0, bargs); | 3235 | update_ioctl_balance_args(fs_info, 0, bargs); |
3231 | } | 3236 | } |
3232 | 3237 | ||
3238 | if ((ret && ret != -ECANCELED && ret != -ENOSPC) || | ||
3239 | balance_need_close(fs_info)) { | ||
3240 | __cancel_balance(fs_info); | ||
3241 | } | ||
3242 | |||
3233 | wake_up(&fs_info->balance_wait_q); | 3243 | wake_up(&fs_info->balance_wait_q); |
3234 | 3244 | ||
3235 | return ret; | 3245 | return ret; |