@@ -2324,11 +2324,12 @@ static int btrfs_init_workqueues(struct btrfs_fs_info *fs_info)
fs_info->endio_freespace_worker && fs_info->rmw_workers &&
fs_info->caching_workers && fs_info->fixup_workers &&
fs_info->delayed_workers && fs_info->qgroup_rescan_workers &&
- fs_info->discard_ctl.discard_workers)) {
- return -ENOMEM;
- }
-
+ fs_info->discard_ctl.discard_workers))
+ goto error;
return 0;
+error:
+ btrfs_stop_all_workers(fs_info);
+ return -ENOMEM;
}
static int btrfs_init_csum_hash(struct btrfs_fs_info *fs_info, u16 csum_type)
@@ -3613,6 +3614,9 @@ static const struct init_sequence open_ctree_seq[] = {
}, {
.init_func = open_ctree_features_init,
.exit_func = NULL,
+ }, {
+ .init_func = btrfs_init_workqueues,
+ .exit_func = btrfs_stop_all_workers,
}
};
@@ -3640,12 +3644,6 @@ int __cold open_ctree(struct super_block *sb, char *options)
open_ctree_res[i] = true;
}
- ret = btrfs_init_workqueues(fs_info);
- if (ret) {
- err = ret;
- goto fail_sb_buffer;
- }
-
mutex_lock(&fs_info->chunk_mutex);
ret = btrfs_read_sys_array(fs_info);
mutex_unlock(&fs_info->chunk_mutex);
@@ -3903,7 +3901,6 @@ int __cold open_ctree(struct super_block *sb, char *options)
free_root_pointers(fs_info, true);
fail_sb_buffer:
- btrfs_stop_all_workers(fs_info);
btrfs_free_block_groups(fs_info);
btrfs_mapping_tree_free(&fs_info->mapping_tree);
fail:
Those two helpers are already doing all the work, just move them into the open_ctree_seq[] array. There is only one small change: - Call btrfs_stop_all_workers() inside btrfs_init_workqueus() for error handling Since open_ctree_seq[] makes all error path to call the exit function if and only if the corresponding init function finished without error. This means, if btrfs_init_workqueus() failed due to -ENOMEM, then we won't call btrfs_stop_all_workers() to cleanup whatever is already allocatd. To fix this problem, call btrfs_stop_all_workers() inside btrfs_init_workqueus() when we hit errors. Function btrfs_stop_all_workers() already has the checks to handle NULL pointers. Signed-off-by: Qu Wenruo <wqu@suse.com> --- fs/btrfs/disk-io.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-)