diff options
Diffstat (limited to 'fs/btrfs/scrub.c')
-rw-r--r-- | fs/btrfs/scrub.c | 39 |
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, | |||
3571 | static noinline_for_stack int scrub_workers_get(struct btrfs_fs_info *fs_info, | 3571 | static 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; |
3613 | out: | 3606 | return 0; |
3614 | return ret; | 3607 | |
3608 | fail_scrub_parity_workers: | ||
3609 | btrfs_destroy_workqueue(fs_info->scrub_nocow_workers); | ||
3610 | fail_scrub_nocow_workers: | ||
3611 | btrfs_destroy_workqueue(fs_info->scrub_wr_completion_workers); | ||
3612 | fail_scrub_wr_completion_workers: | ||
3613 | btrfs_destroy_workqueue(fs_info->scrub_workers); | ||
3614 | fail_scrub_workers: | ||
3615 | return -ENOMEM; | ||
3615 | } | 3616 | } |
3616 | 3617 | ||
3617 | static noinline_for_stack void scrub_workers_put(struct btrfs_fs_info *fs_info) | 3618 | static noinline_for_stack void scrub_workers_put(struct btrfs_fs_info *fs_info) |