erofs: initialize decompression early
[ 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 <hsiangkao@linux.alibaba.com> Acked-by: Chao Yu <chao@kernel.org> Link: https://lore.kernel.org/r/20250317054840.3483000-1-hsiangkao@linux.alibaba.com Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
c8c643809f
commit
b35ccfdc85
@@ -453,6 +453,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,
|
||||
@@ -462,7 +463,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) {}
|
||||
@@ -471,7 +471,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
|
||||
|
||||
@@ -664,9 +664,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))
|
||||
@@ -678,24 +685,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;
|
||||
@@ -831,6 +825,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);
|
||||
@@ -840,6 +844,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);
|
||||
@@ -850,17 +855,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);
|
||||
|
||||
@@ -663,18 +663,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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user