aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/scrub.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/scrub.c')
-rw-r--r--fs/btrfs/scrub.c39
1 files changed, 20 insertions, 19 deletions
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c
index 9f2feabe99f2..94db0fa5225a 100644
--- a/fs/btrfs/scrub.c
+++ b/fs/btrfs/scrub.c
@@ -3571,7 +3571,6 @@ static noinline_for_stack int scrub_supers(struct scrub_ctx *sctx,
3571static noinline_for_stack int scrub_workers_get(struct btrfs_fs_info *fs_info, 3571static noinline_for_stack int scrub_workers_get(struct btrfs_fs_info *fs_info,
3572 int is_dev_replace) 3572 int is_dev_replace)
3573{ 3573{
3574 int ret = 0;
3575 unsigned int flags = WQ_FREEZABLE | WQ_UNBOUND; 3574 unsigned int flags = WQ_FREEZABLE | WQ_UNBOUND;
3576 int max_active = fs_info->thread_pool_size; 3575 int max_active = fs_info->thread_pool_size;
3577 3576
@@ -3584,34 +3583,36 @@ static noinline_for_stack int scrub_workers_get(struct btrfs_fs_info *fs_info,
3584 fs_info->scrub_workers = 3583 fs_info->scrub_workers =
3585 btrfs_alloc_workqueue("btrfs-scrub", flags, 3584 btrfs_alloc_workqueue("btrfs-scrub", flags,
3586 max_active, 4); 3585 max_active, 4);
3587 if (!fs_info->scrub_workers) { 3586 if (!fs_info->scrub_workers)
3588 ret = -ENOMEM; 3587 goto fail_scrub_workers;
3589 goto out; 3588
3590 }
3591 fs_info->scrub_wr_completion_workers = 3589 fs_info->scrub_wr_completion_workers =
3592 btrfs_alloc_workqueue("btrfs-scrubwrc", flags, 3590 btrfs_alloc_workqueue("btrfs-scrubwrc", flags,
3593 max_active, 2); 3591 max_active, 2);
3594 if (!fs_info->scrub_wr_completion_workers) { 3592 if (!fs_info->scrub_wr_completion_workers)
3595 ret = -ENOMEM; 3593 goto fail_scrub_wr_completion_workers;
3596 goto out; 3594
3597 }
3598 fs_info->scrub_nocow_workers = 3595 fs_info->scrub_nocow_workers =
3599 btrfs_alloc_workqueue("btrfs-scrubnc", flags, 1, 0); 3596 btrfs_alloc_workqueue("btrfs-scrubnc", flags, 1, 0);
3600 if (!fs_info->scrub_nocow_workers) { 3597 if (!fs_info->scrub_nocow_workers)
3601 ret = -ENOMEM; 3598 goto fail_scrub_nocow_workers;
3602 goto out;
3603 }
3604 fs_info->scrub_parity_workers = 3599 fs_info->scrub_parity_workers =
3605 btrfs_alloc_workqueue("btrfs-scrubparity", flags, 3600 btrfs_alloc_workqueue("btrfs-scrubparity", flags,
3606 max_active, 2); 3601 max_active, 2);
3607 if (!fs_info->scrub_parity_workers) { 3602 if (!fs_info->scrub_parity_workers)
3608 ret = -ENOMEM; 3603 goto fail_scrub_parity_workers;
3609 goto out;
3610 }
3611 } 3604 }
3612 ++fs_info->scrub_workers_refcnt; 3605 ++fs_info->scrub_workers_refcnt;
3613out: 3606 return 0;
3614 return ret; 3607
3608fail_scrub_parity_workers:
3609 btrfs_destroy_workqueue(fs_info->scrub_nocow_workers);
3610fail_scrub_nocow_workers:
3611 btrfs_destroy_workqueue(fs_info->scrub_wr_completion_workers);
3612fail_scrub_wr_completion_workers:
3613 btrfs_destroy_workqueue(fs_info->scrub_workers);
3614fail_scrub_workers:
3615 return -ENOMEM;
3615} 3616}
3616 3617
3617static noinline_for_stack void scrub_workers_put(struct btrfs_fs_info *fs_info) 3618static noinline_for_stack void scrub_workers_put(struct btrfs_fs_info *fs_info)