From: Gao Xiang <hsiang...@linux.alibaba.com>

[ Upstream commit fe1e57d44d7f106df9048e815e4862cf63921220 ]

 - 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>
Link: 
https://lore.kernel.org/r/20250317054840.3483000-1-hsiang...@linux.alibaba.com
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 fs/erofs/internal.h |  4 ++--
 fs/erofs/super.c    | 46 ++++++++++++++++++++++-----------------------
 fs/erofs/zdata.c    |  4 ++--
 3 files changed, 26 insertions(+), 28 deletions(-)

diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h
index efd25f3101f1f..2b8d9a10f0026 100644
--- a/fs/erofs/internal.h
+++ b/fs/erofs/internal.h
@@ -446,6 +446,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,
@@ -455,7 +456,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) {}
@@ -464,7 +464,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 9f2bce5af9c83..b30125a2a5011 100644
--- a/fs/erofs/super.c
+++ b/fs/erofs/super.c
@@ -631,9 +631,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))
@@ -645,24 +652,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;
@@ -798,6 +792,16 @@ static int erofs_init_fs_context(struct fs_context *fc)
        return 0;
 }
 
+static void erofs_drop_internal_inodes(struct erofs_sb_info *sbi)
+{
+       iput(sbi->packed_inode);
+       sbi->packed_inode = NULL;
+#ifdef CONFIG_EROFS_FS_ZIP
+       iput(sbi->managed_cache);
+       sbi->managed_cache = NULL;
+#endif
+}
+
 static void erofs_kill_sb(struct super_block *sb)
 {
        struct erofs_sb_info *sbi = EROFS_SB(sb);
@@ -807,6 +811,7 @@ static void erofs_kill_sb(struct super_block *sb)
                kill_anon_super(sb);
        else
                kill_block_super(sb);
+       erofs_drop_internal_inodes(sbi);
        fs_put_dax(sbi->dif0.dax_dev, NULL);
        erofs_fscache_unregister_fs(sb);
        erofs_sb_free(sbi);
@@ -817,17 +822,10 @@ 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_drop_internal_inodes(sbi);
        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 d771e06db7386..4490761018c9b 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.39.5


Reply via email to