@@ -3728,6 +3728,44 @@ static int open_ctree_load_items_init(struct btrfs_fs_info *fs_info)
return 0;
}
+static int open_ctree_sysfs_init(struct btrfs_fs_info *fs_info)
+{
+ int ret;
+
+ ret = btrfs_sysfs_add_fsid(fs_info->fs_devices);
+ if (ret) {
+ btrfs_err(fs_info, "failed to init sysfs fsid interface: %d",
+ ret);
+ return ret;
+ }
+
+ ret = btrfs_sysfs_add_mounted(fs_info);
+ if (ret) {
+ btrfs_err(fs_info, "failed to init sysfs interface: %d", ret);
+ goto free_fsid;
+ }
+
+ /* This can only be called after the fsid entry being added. */
+ ret = btrfs_init_space_info(fs_info);
+ if (ret) {
+ btrfs_err(fs_info, "failed to initialize space info: %d", ret);
+ goto free_mounted;
+ }
+ return 0;
+
+free_mounted:
+ btrfs_sysfs_remove_mounted(fs_info);
+free_fsid:
+ btrfs_sysfs_remove_fsid(fs_info->fs_devices);
+ return ret;
+}
+
+static void open_ctree_sysfs_exit(struct btrfs_fs_info *fs_info)
+{
+ btrfs_sysfs_remove_mounted(fs_info);
+ btrfs_sysfs_remove_fsid(fs_info->fs_devices);
+}
+
struct init_sequence {
int (*init_func)(struct btrfs_fs_info *fs_info);
void (*exit_func)(struct btrfs_fs_info *fs_info);
@@ -3755,6 +3793,9 @@ static const struct init_sequence open_ctree_seq[] = {
}, {
.init_func = open_ctree_load_items_init,
.exit_func = NULL,
+ }, {
+ .init_func = open_ctree_sysfs_init,
+ .exit_func = open_ctree_sysfs_exit,
}
};
@@ -3780,25 +3821,6 @@ int __cold open_ctree(struct super_block *sb, char *options)
open_ctree_res[i] = true;
}
- ret = btrfs_sysfs_add_fsid(fs_devices);
- if (ret) {
- btrfs_err(fs_info, "failed to init sysfs fsid interface: %d",
- ret);
- goto fail_block_groups;
- }
-
- ret = btrfs_sysfs_add_mounted(fs_info);
- if (ret) {
- btrfs_err(fs_info, "failed to init sysfs interface: %d", ret);
- goto fail_fsdev_sysfs;
- }
-
- ret = btrfs_init_space_info(fs_info);
- if (ret) {
- btrfs_err(fs_info, "failed to initialize space info: %d", ret);
- goto fail_sysfs;
- }
-
ret = btrfs_read_block_groups(fs_info);
if (ret) {
btrfs_err(fs_info, "failed to read block groups: %d", ret);
@@ -3898,12 +3920,6 @@ int __cold open_ctree(struct super_block *sb, char *options)
filemap_write_and_wait(fs_info->btree_inode->i_mapping);
fail_sysfs:
- btrfs_sysfs_remove_mounted(fs_info);
-
-fail_fsdev_sysfs:
- btrfs_sysfs_remove_fsid(fs_info->fs_devices);
-
-fail_block_groups:
btrfs_put_block_group_cache(fs_info);
btrfs_free_block_groups(fs_info);
fail:
The three functions, btrfs_sysfs_add_fsid(), btrfs_sysfs_add_mounted() and btrfs_init_space_info() are all doing sysfs related code. The last one can only be called after fsid sysfs entry created, thus they are all put into the same helper. Signed-off-by: Qu Wenruo <wqu@suse.com> --- fs/btrfs/disk-io.c | 66 ++++++++++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 25 deletions(-)