Skip to content

Commit fe1e57d

Browse files
committed
erofs: initialize decompression early
- 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 <[email protected]> Acked-by: Chao Yu <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent e9dfe33 commit fe1e57d

File tree

3 files changed

+26
-28
lines changed

3 files changed

+26
-28
lines changed

fs/erofs/internal.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,7 @@ int __init erofs_init_shrinker(void);
436436
void erofs_exit_shrinker(void);
437437
int __init z_erofs_init_subsystem(void);
438438
void z_erofs_exit_subsystem(void);
439+
int z_erofs_init_super(struct super_block *sb);
439440
unsigned long z_erofs_shrink_scan(struct erofs_sb_info *sbi,
440441
unsigned long nr_shrink);
441442
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);
445446
int z_erofs_gbuf_growsize(unsigned int nrpages);
446447
int __init z_erofs_gbuf_init(void);
447448
void z_erofs_gbuf_exit(void);
448-
int erofs_init_managed_cache(struct super_block *sb);
449449
int z_erofs_parse_cfgs(struct super_block *sb, struct erofs_super_block *dsb);
450450
#else
451451
static inline void erofs_shrinker_register(struct super_block *sb) {}
@@ -454,7 +454,7 @@ static inline int erofs_init_shrinker(void) { return 0; }
454454
static inline void erofs_exit_shrinker(void) {}
455455
static inline int z_erofs_init_subsystem(void) { return 0; }
456456
static inline void z_erofs_exit_subsystem(void) {}
457-
static inline int erofs_init_managed_cache(struct super_block *sb) { return 0; }
457+
static inline int z_erofs_init_super(struct super_block *sb) { return 0; }
458458
#endif /* !CONFIG_EROFS_FS_ZIP */
459459

460460
#ifdef CONFIG_EROFS_FS_BACKED_BY_FILE

fs/erofs/super.c

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -636,9 +636,16 @@ static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc)
636636
else
637637
sb->s_flags &= ~SB_POSIXACL;
638638

639-
#ifdef CONFIG_EROFS_FS_ZIP
640-
xa_init(&sbi->managed_pslots);
641-
#endif
639+
err = z_erofs_init_super(sb);
640+
if (err)
641+
return err;
642+
643+
if (erofs_sb_has_fragments(sbi) && sbi->packed_nid) {
644+
inode = erofs_iget(sb, sbi->packed_nid);
645+
if (IS_ERR(inode))
646+
return PTR_ERR(inode);
647+
sbi->packed_inode = inode;
648+
}
642649

643650
inode = erofs_iget(sb, sbi->root_nid);
644651
if (IS_ERR(inode))
@@ -650,24 +657,11 @@ static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc)
650657
iput(inode);
651658
return -EINVAL;
652659
}
653-
654660
sb->s_root = d_make_root(inode);
655661
if (!sb->s_root)
656662
return -ENOMEM;
657663

658664
erofs_shrinker_register(sb);
659-
if (erofs_sb_has_fragments(sbi) && sbi->packed_nid) {
660-
sbi->packed_inode = erofs_iget(sb, sbi->packed_nid);
661-
if (IS_ERR(sbi->packed_inode)) {
662-
err = PTR_ERR(sbi->packed_inode);
663-
sbi->packed_inode = NULL;
664-
return err;
665-
}
666-
}
667-
err = erofs_init_managed_cache(sb);
668-
if (err)
669-
return err;
670-
671665
err = erofs_xattr_prefixes_init(sb);
672666
if (err)
673667
return err;
@@ -803,6 +797,16 @@ static int erofs_init_fs_context(struct fs_context *fc)
803797
return 0;
804798
}
805799

800+
static void erofs_drop_internal_inodes(struct erofs_sb_info *sbi)
801+
{
802+
iput(sbi->packed_inode);
803+
sbi->packed_inode = NULL;
804+
#ifdef CONFIG_EROFS_FS_ZIP
805+
iput(sbi->managed_cache);
806+
sbi->managed_cache = NULL;
807+
#endif
808+
}
809+
806810
static void erofs_kill_sb(struct super_block *sb)
807811
{
808812
struct erofs_sb_info *sbi = EROFS_SB(sb);
@@ -812,6 +816,7 @@ static void erofs_kill_sb(struct super_block *sb)
812816
kill_anon_super(sb);
813817
else
814818
kill_block_super(sb);
819+
erofs_drop_internal_inodes(sbi);
815820
fs_put_dax(sbi->dif0.dax_dev, NULL);
816821
erofs_fscache_unregister_fs(sb);
817822
erofs_sb_free(sbi);
@@ -822,17 +827,10 @@ static void erofs_put_super(struct super_block *sb)
822827
{
823828
struct erofs_sb_info *const sbi = EROFS_SB(sb);
824829

825-
DBG_BUGON(!sbi);
826-
827830
erofs_unregister_sysfs(sb);
828831
erofs_shrinker_unregister(sb);
829832
erofs_xattr_prefixes_cleanup(sb);
830-
#ifdef CONFIG_EROFS_FS_ZIP
831-
iput(sbi->managed_cache);
832-
sbi->managed_cache = NULL;
833-
#endif
834-
iput(sbi->packed_inode);
835-
sbi->packed_inode = NULL;
833+
erofs_drop_internal_inodes(sbi);
836834
erofs_free_dev_context(sbi->devs);
837835
sbi->devs = NULL;
838836
erofs_fscache_unregister_fs(sb);

fs/erofs/zdata.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -644,18 +644,18 @@ static const struct address_space_operations z_erofs_cache_aops = {
644644
.invalidate_folio = z_erofs_cache_invalidate_folio,
645645
};
646646

647-
int erofs_init_managed_cache(struct super_block *sb)
647+
int z_erofs_init_super(struct super_block *sb)
648648
{
649649
struct inode *const inode = new_inode(sb);
650650

651651
if (!inode)
652652
return -ENOMEM;
653-
654653
set_nlink(inode, 1);
655654
inode->i_size = OFFSET_MAX;
656655
inode->i_mapping->a_ops = &z_erofs_cache_aops;
657656
mapping_set_gfp_mask(inode->i_mapping, GFP_KERNEL);
658657
EROFS_SB(sb)->managed_cache = inode;
658+
xa_init(&EROFS_SB(sb)->managed_pslots);
659659
return 0;
660660
}
661661

0 commit comments

Comments
 (0)