summaryrefslogtreecommitdiffstats
path: root/fs/btrfs/volumes.c
diff options
context:
space:
mode:
authorDavid Sterba2018-03-20 20:07:58 +0100
committerDavid Sterba2018-05-28 18:07:25 +0200
commiteee95e3fb0c3bcda4e85fc219964f2f69a218f03 (patch)
treedbdd460255f4ea9a0f6e21b95303403d0853cc0f /fs/btrfs/volumes.c
parentbtrfs: add proper safety check before resuming dev-replace (diff)
downloadkernel-qcow2-linux-eee95e3fb0c3bcda4e85fc219964f2f69a218f03.tar.gz
kernel-qcow2-linux-eee95e3fb0c3bcda4e85fc219964f2f69a218f03.tar.xz
kernel-qcow2-linux-eee95e3fb0c3bcda4e85fc219964f2f69a218f03.zip
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.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 7e3656c9798b..585f93013214 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -4047,7 +4047,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);