diff options
author | David Sterba <dsterba@suse.com> | 2018-03-20 20:07:58 +0100 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2018-05-07 14:51:10 +0200 |
commit | 9b0547a24d387ba00e19a696a8265abf9e5eec32 (patch) | |
tree | ab49926ac5a553ed689e633413894ff0a94ba759 /fs/btrfs/volumes.c | |
parent | 6776b81d391a31268bdaa1403f2c87183819f1f3 (diff) | |
download | linux-next-9b0547a24d387ba00e19a696a8265abf9e5eec32.tar.gz |
btrfs: add sanity check when resuming balance after mount
Replace a WARN_ON with a proper check and message in case something goes
really wrong and resumed balance cannot set up its exclusive status.
The check is a user friendly assertion, I don't expect to ever happen
under normal circumstances.
Also document that the paused balance starts here and owns the exclusive
op status.
Reviewed-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'fs/btrfs/volumes.c')
-rw-r--r-- | fs/btrfs/volumes.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 72315063d674..a9bfd5c0fba1 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -4038,7 +4038,19 @@ int btrfs_recover_balance(struct btrfs_fs_info *fs_info) btrfs_balance_sys(leaf, item, &disk_bargs); btrfs_disk_balance_args_to_cpu(&bctl->sys, &disk_bargs); - WARN_ON(test_and_set_bit(BTRFS_FS_EXCL_OP, &fs_info->flags)); + /* + * This should never happen, as the paused balance state is recovered + * during mount without any chance of other exclusive ops to collide. + * + * This gives the exclusive op status to balance and keeps in paused + * state until user intervention (cancel or umount). If the ownership + * cannot be assigned, show a message but do not fail. The balance + * is in a paused state and must have fs_info::balance_ctl properly + * set up. + */ + if (test_and_set_bit(BTRFS_FS_EXCL_OP, &fs_info->flags)) + btrfs_warn(fs_info, + "cannot set exclusive op status to balance, resume manually"); mutex_lock(&fs_info->volume_mutex); mutex_lock(&fs_info->balance_mutex); |