Skip to content

Commit e82afc5

Browse files
zhaoleiddmasoncl
authored andcommitted
btrfs: add error handling for scrub_workers_get()
Although it is a rare case, we'd better free previous allocated memory on error. Signed-off-by: Zhao Lei <zhaolei@cn.fujitsu.com> Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: Chris Mason <clm@fb.com>
1 parent 65f5333 commit e82afc5

File tree

1 file changed

+20
-19
lines changed

1 file changed

+20
-19
lines changed

fs/btrfs/scrub.c

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3571,7 +3571,6 @@ static noinline_for_stack int scrub_supers(struct scrub_ctx *sctx,
35713571
static noinline_for_stack int scrub_workers_get(struct btrfs_fs_info *fs_info,
35723572
int is_dev_replace)
35733573
{
3574-
int ret = 0;
35753574
unsigned int flags = WQ_FREEZABLE | WQ_UNBOUND;
35763575
int max_active = fs_info->thread_pool_size;
35773576

@@ -3584,34 +3583,36 @@ static noinline_for_stack int scrub_workers_get(struct btrfs_fs_info *fs_info,
35843583
fs_info->scrub_workers =
35853584
btrfs_alloc_workqueue("btrfs-scrub", flags,
35863585
max_active, 4);
3587-
if (!fs_info->scrub_workers) {
3588-
ret = -ENOMEM;
3589-
goto out;
3590-
}
3586+
if (!fs_info->scrub_workers)
3587+
goto fail_scrub_workers;
3588+
35913589
fs_info->scrub_wr_completion_workers =
35923590
btrfs_alloc_workqueue("btrfs-scrubwrc", flags,
35933591
max_active, 2);
3594-
if (!fs_info->scrub_wr_completion_workers) {
3595-
ret = -ENOMEM;
3596-
goto out;
3597-
}
3592+
if (!fs_info->scrub_wr_completion_workers)
3593+
goto fail_scrub_wr_completion_workers;
3594+
35983595
fs_info->scrub_nocow_workers =
35993596
btrfs_alloc_workqueue("btrfs-scrubnc", flags, 1, 0);
3600-
if (!fs_info->scrub_nocow_workers) {
3601-
ret = -ENOMEM;
3602-
goto out;
3603-
}
3597+
if (!fs_info->scrub_nocow_workers)
3598+
goto fail_scrub_nocow_workers;
36043599
fs_info->scrub_parity_workers =
36053600
btrfs_alloc_workqueue("btrfs-scrubparity", flags,
36063601
max_active, 2);
3607-
if (!fs_info->scrub_parity_workers) {
3608-
ret = -ENOMEM;
3609-
goto out;
3610-
}
3602+
if (!fs_info->scrub_parity_workers)
3603+
goto fail_scrub_parity_workers;
36113604
}
36123605
++fs_info->scrub_workers_refcnt;
3613-
out:
3614-
return ret;
3606+
return 0;
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;
36153616
}
36163617

36173618
static noinline_for_stack void scrub_workers_put(struct btrfs_fs_info *fs_info)

0 commit comments

Comments
 (0)