return -ENOMEM;
}
+static noinline_for_stack void scrub_workers_put(struct btrfs_fs_info *fs_info)
+{
+ if (--fs_info->scrub_workers_refcnt == 0) {
+ btrfs_destroy_workqueue(fs_info->scrub_workers);
+ btrfs_destroy_workqueue(fs_info->scrub_wr_completion_workers);
+ btrfs_destroy_workqueue(fs_info->scrub_parity_workers);
+ }
+ WARN_ON(fs_info->scrub_workers_refcnt < 0);
+}
+
int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start,
u64 end, struct btrfs_scrub_progress *progress,
int readonly, int is_dev_replace)
int ret;
struct btrfs_device *dev;
unsigned int nofs_flag;
- struct btrfs_workqueue *scrub_workers = NULL;
- struct btrfs_workqueue *scrub_wr_comp = NULL;
- struct btrfs_workqueue *scrub_parity = NULL;
if (btrfs_fs_closing(fs_info))
return -EINVAL;
mutex_lock(&fs_info->scrub_lock);
dev->scrub_ctx = NULL;
- if (--fs_info->scrub_workers_refcnt == 0) {
- scrub_workers = fs_info->scrub_workers;
- scrub_wr_comp = fs_info->scrub_wr_completion_workers;
- scrub_parity = fs_info->scrub_parity_workers;
- }
+ scrub_workers_put(fs_info);
mutex_unlock(&fs_info->scrub_lock);
- btrfs_destroy_workqueue(scrub_workers);
- btrfs_destroy_workqueue(scrub_wr_comp);
- btrfs_destroy_workqueue(scrub_parity);
scrub_put_ctx(sctx);
return ret;