btrfs: make device add compatible with paused balance in btrfs_exclop_start_try_lock
authorNikolay Borisov <nborisov@suse.com>
Thu, 25 Nov 2021 09:14:42 +0000 (11:14 +0200)
committerDavid Sterba <dsterba@suse.com>
Fri, 7 Jan 2022 13:18:23 +0000 (14:18 +0100)
This is needed to enable device add to work in cases when a file system
has been mounted with 'skip_balance' mount option.

Signed-off-by: Nikolay Borisov <nborisov@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/ioctl.c

index 6752e4b..f706287 100644 (file)
@@ -387,6 +387,7 @@ bool btrfs_exclop_start(struct btrfs_fs_info *fs_info,
  *
  * Compatibility:
  * - the same type is already running
+ * - when trying to add a device and balance has been paused
  * - not BTRFS_EXCLOP_NONE - this is intentionally incompatible and the caller
  *   must check the condition first that would allow none -> @type
  */
@@ -394,7 +395,9 @@ bool btrfs_exclop_start_try_lock(struct btrfs_fs_info *fs_info,
                                 enum btrfs_exclusive_operation type)
 {
        spin_lock(&fs_info->super_lock);
-       if (fs_info->exclusive_operation == type)
+       if (fs_info->exclusive_operation == type ||
+           (fs_info->exclusive_operation == BTRFS_EXCLOP_BALANCE_PAUSED &&
+            type == BTRFS_EXCLOP_DEV_ADD))
                return true;
 
        spin_unlock(&fs_info->super_lock);