Commit e82afc52 authored by Zhao Lei's avatar Zhao Lei Committed by Chris Mason

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: default avatarZhao Lei <zhaolei@cn.fujitsu.com>
Signed-off-by: default avatarQu Wenruo <quwenruo@cn.fujitsu.com>
Signed-off-by: default avatarChris Mason <clm@fb.com>
parent 65f53338
...@@ -3571,7 +3571,6 @@ static noinline_for_stack int scrub_supers(struct scrub_ctx *sctx, ...@@ -3571,7 +3571,6 @@ static noinline_for_stack int scrub_supers(struct scrub_ctx *sctx,
static noinline_for_stack int scrub_workers_get(struct btrfs_fs_info *fs_info, static noinline_for_stack int scrub_workers_get(struct btrfs_fs_info *fs_info,
int is_dev_replace) int is_dev_replace)
{ {
int ret = 0;
unsigned int flags = WQ_FREEZABLE | WQ_UNBOUND; unsigned int flags = WQ_FREEZABLE | WQ_UNBOUND;
int max_active = fs_info->thread_pool_size; int max_active = fs_info->thread_pool_size;
...@@ -3584,34 +3583,36 @@ static noinline_for_stack int scrub_workers_get(struct btrfs_fs_info *fs_info, ...@@ -3584,34 +3583,36 @@ static noinline_for_stack int scrub_workers_get(struct btrfs_fs_info *fs_info,
fs_info->scrub_workers = fs_info->scrub_workers =
btrfs_alloc_workqueue("btrfs-scrub", flags, btrfs_alloc_workqueue("btrfs-scrub", flags,
max_active, 4); max_active, 4);
if (!fs_info->scrub_workers) { if (!fs_info->scrub_workers)
ret = -ENOMEM; goto fail_scrub_workers;
goto out;
}
fs_info->scrub_wr_completion_workers = fs_info->scrub_wr_completion_workers =
btrfs_alloc_workqueue("btrfs-scrubwrc", flags, btrfs_alloc_workqueue("btrfs-scrubwrc", flags,
max_active, 2); max_active, 2);
if (!fs_info->scrub_wr_completion_workers) { if (!fs_info->scrub_wr_completion_workers)
ret = -ENOMEM; goto fail_scrub_wr_completion_workers;
goto out;
}
fs_info->scrub_nocow_workers = fs_info->scrub_nocow_workers =
btrfs_alloc_workqueue("btrfs-scrubnc", flags, 1, 0); btrfs_alloc_workqueue("btrfs-scrubnc", flags, 1, 0);
if (!fs_info->scrub_nocow_workers) { if (!fs_info->scrub_nocow_workers)
ret = -ENOMEM; goto fail_scrub_nocow_workers;
goto out;
}
fs_info->scrub_parity_workers = fs_info->scrub_parity_workers =
btrfs_alloc_workqueue("btrfs-scrubparity", flags, btrfs_alloc_workqueue("btrfs-scrubparity", flags,
max_active, 2); max_active, 2);
if (!fs_info->scrub_parity_workers) { if (!fs_info->scrub_parity_workers)
ret = -ENOMEM; goto fail_scrub_parity_workers;
goto out;
}
} }
++fs_info->scrub_workers_refcnt; ++fs_info->scrub_workers_refcnt;
out: return 0;
return ret;
fail_scrub_parity_workers:
btrfs_destroy_workqueue(fs_info->scrub_nocow_workers);
fail_scrub_nocow_workers:
btrfs_destroy_workqueue(fs_info->scrub_wr_completion_workers);
fail_scrub_wr_completion_workers:
btrfs_destroy_workqueue(fs_info->scrub_workers);
fail_scrub_workers:
return -ENOMEM;
} }
static noinline_for_stack void scrub_workers_put(struct btrfs_fs_info *fs_info) static noinline_for_stack void scrub_workers_put(struct btrfs_fs_info *fs_info)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment