|
@@ -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);
|
|
|
}
|