@@ -3733,6 +3733,50 @@ static void open_ctree_tree_roots_exit(struct btrfs_fs_info *fs_info)
free_root_pointers(fs_info, true);
}
+/* Load various items for balance/replace, and do various mount time check. */
+static int open_ctree_load_items_init(struct btrfs_fs_info *fs_info)
+{
+ int ret;
+
+ /*
+ * Dev extents can only be verified after both dev tree and chunk tree
+ * being initialized.
+ */
+ ret = btrfs_verify_dev_extents(fs_info);
+ if (ret) {
+ btrfs_err(fs_info,
+ "failed to verify dev extents against chunks: %d",
+ ret);
+ return ret;
+ }
+ ret = btrfs_recover_balance(fs_info);
+ if (ret) {
+ btrfs_err(fs_info, "failed to recover balance: %d", ret);
+ return ret;
+ }
+
+ ret = btrfs_init_dev_stats(fs_info);
+ if (ret) {
+ btrfs_err(fs_info, "failed to init dev_stats: %d", ret);
+ return ret;
+ }
+
+ ret = btrfs_init_dev_replace(fs_info);
+ if (ret) {
+ btrfs_err(fs_info, "failed to init dev_replace: %d", ret);
+ return ret;
+ }
+
+ ret = btrfs_check_zoned_mode(fs_info);
+ if (ret) {
+ btrfs_err(fs_info, "failed to initialize zoned mode: %d", ret);
+ return ret;
+ }
+ btrfs_free_zone_cache(fs_info);
+
+ return 0;
+}
+
struct init_sequence {
int (*init_func)(struct btrfs_fs_info *fs_info);
void (*exit_func)(struct btrfs_fs_info *fs_info);
@@ -3757,6 +3801,9 @@ static const struct init_sequence open_ctree_seq[] = {
}, {
.init_func = open_ctree_tree_roots_init,
.exit_func = open_ctree_tree_roots_exit,
+ }, {
+ .init_func = open_ctree_load_items_init,
+ .exit_func = NULL,
}
};
@@ -3782,38 +3829,6 @@ int __cold open_ctree(struct super_block *sb, char *options)
open_ctree_res[i] = true;
}
- ret = btrfs_verify_dev_extents(fs_info);
- if (ret) {
- btrfs_err(fs_info,
- "failed to verify dev extents against chunks: %d",
- ret);
- goto fail_block_groups;
- }
- ret = btrfs_recover_balance(fs_info);
- if (ret) {
- btrfs_err(fs_info, "failed to recover balance: %d", ret);
- goto fail_block_groups;
- }
-
- ret = btrfs_init_dev_stats(fs_info);
- if (ret) {
- btrfs_err(fs_info, "failed to init dev_stats: %d", ret);
- goto fail_block_groups;
- }
-
- ret = btrfs_init_dev_replace(fs_info);
- if (ret) {
- btrfs_err(fs_info, "failed to init dev_replace: %d", ret);
- goto fail_block_groups;
- }
-
- ret = btrfs_check_zoned_mode(fs_info);
- if (ret) {
- btrfs_err(fs_info, "failed to initialize zoned mode: %d",
- ret);
- goto fail_block_groups;
- }
-
ret = btrfs_sysfs_add_fsid(fs_devices);
if (ret) {
btrfs_err(fs_info, "failed to init sysfs fsid interface: %d",
@@ -3839,8 +3854,6 @@ int __cold open_ctree(struct super_block *sb, char *options)
goto fail_sysfs;
}
- btrfs_free_zone_cache(fs_info);
-
fs_info->cleaner_kthread = kthread_run(cleaner_kthread, fs_info,
"btrfs-cleaner");
if (IS_ERR(fs_info->cleaner_kthread))
One thing to notice is, since we're also initializing zoned mode, also move later btrfs_free_zone_cache() call into the helper to concentrace the zoned code. As later I found it pretty hard to find any logical connection around that btrfs_free_zone_cache() call. Signed-off-by: Qu Wenruo <wqu@suse.com> --- fs/btrfs/disk-io.c | 81 +++++++++++++++++++++++++++------------------- 1 file changed, 47 insertions(+), 34 deletions(-)