- Rename erofs_init_managed_cache() to z_erofs_init_super();
 - Move the initialization of managed_pslots into z_erofs_init_super() too;
 - Move z_erofs_init_super() and packed inode preparation upwards, before
   the root inode initialization.

Therefore, the root directory can also be compressible.

Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com>
Acked-by: Chao Yu <c...@kernel.org>
---
v2:
 - move iput(packed_inode/managed_cache) into .kill_sb() since
   they are initialized prior to d_make_root().

 fs/erofs/internal.h |  4 ++--
 fs/erofs/super.c    | 40 ++++++++++++++++------------------------
 fs/erofs/zdata.c    |  4 ++--
 3 files changed, 20 insertions(+), 28 deletions(-)

diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h
index 91d0b400459c..b35742cf9431 100644
--- a/fs/erofs/internal.h
+++ b/fs/erofs/internal.h
@@ -436,6 +436,7 @@ int __init erofs_init_shrinker(void);
 void erofs_exit_shrinker(void);
 int __init z_erofs_init_subsystem(void);
 void z_erofs_exit_subsystem(void);
+int z_erofs_init_super(struct super_block *sb);
 unsigned long z_erofs_shrink_scan(struct erofs_sb_info *sbi,
                                  unsigned long nr_shrink);
 int z_erofs_map_blocks_iter(struct inode *inode, struct erofs_map_blocks *map,
@@ -445,7 +446,6 @@ void z_erofs_put_gbuf(void *ptr);
 int z_erofs_gbuf_growsize(unsigned int nrpages);
 int __init z_erofs_gbuf_init(void);
 void z_erofs_gbuf_exit(void);
-int erofs_init_managed_cache(struct super_block *sb);
 int z_erofs_parse_cfgs(struct super_block *sb, struct erofs_super_block *dsb);
 #else
 static inline void erofs_shrinker_register(struct super_block *sb) {}
@@ -454,7 +454,7 @@ static inline int erofs_init_shrinker(void) { return 0; }
 static inline void erofs_exit_shrinker(void) {}
 static inline int z_erofs_init_subsystem(void) { return 0; }
 static inline void z_erofs_exit_subsystem(void) {}
-static inline int erofs_init_managed_cache(struct super_block *sb) { return 0; 
}
+static inline int z_erofs_init_super(struct super_block *sb) { return 0; }
 #endif /* !CONFIG_EROFS_FS_ZIP */
 
 #ifdef CONFIG_EROFS_FS_BACKED_BY_FILE
diff --git a/fs/erofs/super.c b/fs/erofs/super.c
index 18445dc8597d..ae7005f54c98 100644
--- a/fs/erofs/super.c
+++ b/fs/erofs/super.c
@@ -636,9 +636,16 @@ static int erofs_fc_fill_super(struct super_block *sb, 
struct fs_context *fc)
        else
                sb->s_flags &= ~SB_POSIXACL;
 
-#ifdef CONFIG_EROFS_FS_ZIP
-       xa_init(&sbi->managed_pslots);
-#endif
+       err = z_erofs_init_super(sb);
+       if (err)
+               return err;
+
+       if (erofs_sb_has_fragments(sbi) && sbi->packed_nid) {
+               inode = erofs_iget(sb, sbi->packed_nid);
+               if (IS_ERR(inode))
+                       return PTR_ERR(inode);
+               sbi->packed_inode = inode;
+       }
 
        inode = erofs_iget(sb, sbi->root_nid);
        if (IS_ERR(inode))
@@ -650,24 +657,11 @@ static int erofs_fc_fill_super(struct super_block *sb, 
struct fs_context *fc)
                iput(inode);
                return -EINVAL;
        }
-
        sb->s_root = d_make_root(inode);
        if (!sb->s_root)
                return -ENOMEM;
 
        erofs_shrinker_register(sb);
-       if (erofs_sb_has_fragments(sbi) && sbi->packed_nid) {
-               sbi->packed_inode = erofs_iget(sb, sbi->packed_nid);
-               if (IS_ERR(sbi->packed_inode)) {
-                       err = PTR_ERR(sbi->packed_inode);
-                       sbi->packed_inode = NULL;
-                       return err;
-               }
-       }
-       err = erofs_init_managed_cache(sb);
-       if (err)
-               return err;
-
        err = erofs_xattr_prefixes_init(sb);
        if (err)
                return err;
@@ -812,6 +806,12 @@ static void erofs_kill_sb(struct super_block *sb)
                kill_anon_super(sb);
        else
                kill_block_super(sb);
+       iput(sbi->packed_inode);
+       sbi->packed_inode = NULL;
+#ifdef CONFIG_EROFS_FS_ZIP
+       iput(sbi->managed_cache);
+       sbi->managed_cache = NULL;
+#endif
        fs_put_dax(sbi->dif0.dax_dev, NULL);
        erofs_fscache_unregister_fs(sb);
        erofs_sb_free(sbi);
@@ -822,17 +822,9 @@ static void erofs_put_super(struct super_block *sb)
 {
        struct erofs_sb_info *const sbi = EROFS_SB(sb);
 
-       DBG_BUGON(!sbi);
-
        erofs_unregister_sysfs(sb);
        erofs_shrinker_unregister(sb);
        erofs_xattr_prefixes_cleanup(sb);
-#ifdef CONFIG_EROFS_FS_ZIP
-       iput(sbi->managed_cache);
-       sbi->managed_cache = NULL;
-#endif
-       iput(sbi->packed_inode);
-       sbi->packed_inode = NULL;
        erofs_free_dev_context(sbi->devs);
        sbi->devs = NULL;
        erofs_fscache_unregister_fs(sb);
diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c
index 5e4b65070b86..bc6d6842c5c2 100644
--- a/fs/erofs/zdata.c
+++ b/fs/erofs/zdata.c
@@ -644,18 +644,18 @@ static const struct address_space_operations 
z_erofs_cache_aops = {
        .invalidate_folio = z_erofs_cache_invalidate_folio,
 };
 
-int erofs_init_managed_cache(struct super_block *sb)
+int z_erofs_init_super(struct super_block *sb)
 {
        struct inode *const inode = new_inode(sb);
 
        if (!inode)
                return -ENOMEM;
-
        set_nlink(inode, 1);
        inode->i_size = OFFSET_MAX;
        inode->i_mapping->a_ops = &z_erofs_cache_aops;
        mapping_set_gfp_mask(inode->i_mapping, GFP_KERNEL);
        EROFS_SB(sb)->managed_cache = inode;
+       xa_init(&EROFS_SB(sb)->managed_pslots);
        return 0;
 }
 
-- 
2.43.5


Reply via email to