btrfs: add proper safety check before resuming dev-replace
[sfrench/cifs-2.6.git] / fs / btrfs / dev-replace.c
index 8531b5dae777286fd9d342e6819d13d05ad3578b..9fe7be7fdbefaa91233b0a2359242f967c69e845 100644 (file)
@@ -896,7 +896,17 @@ int btrfs_resume_dev_replace_async(struct btrfs_fs_info *fs_info)
        }
        btrfs_dev_replace_write_unlock(dev_replace);
 
-       WARN_ON(test_and_set_bit(BTRFS_FS_EXCL_OP, &fs_info->flags));
+       /*
+        * This could collide with a paused balance, but the exclusive op logic
+        * should never allow both to start and pause. We don't want to allow
+        * dev-replace to start anyway.
+        */
+       if (test_and_set_bit(BTRFS_FS_EXCL_OP, &fs_info->flags)) {
+               btrfs_info(fs_info,
+               "cannot resume dev-replace, other exclusive operation running");
+               return 0;
+       }
+
        task = kthread_run(btrfs_dev_replace_kthread, fs_info, "btrfs-devrepl");
        return PTR_ERR_OR_ZERO(task);
 }