On Wed, Apr 06, 2022 at 03:56:06PM +0800, Jeffle Xu wrote: > Registers fscache context for primary data blob. Also move the > initialization of s_op and related fields forward, since anonymous > inode will be allocated under the super block when registering the > fscache context. > > Something worth mentioning about the cleanup routine. > > 1. The fscache context will instantiate anonymous inodes under the super > block. Release these anonymous inodes when .put_super() is called, or > we'll get "VFS: Busy inodes after unmount." warning. > > 2. The fscache context is initialized prior to the root inode. If > .kill_sb() is called when mount failed, .put_super() won't be called > when root inode has not been initialized yet. Thus .kill_sb() shall > also contain the cleanup routine. > > Signed-off-by: Jeffle Xu <jefflexu@xxxxxxxxxxxxxxxxx> Reviewed-by: Gao Xiang <hsiangkao@xxxxxxxxxxxxxxxxx> Thanks, Gao Xiang > --- > fs/erofs/internal.h | 1 + > fs/erofs/super.c | 15 +++++++++++---- > 2 files changed, 12 insertions(+), 4 deletions(-) > > diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h > index 3a4a344cfed3..eb37b33bce37 100644 > --- a/fs/erofs/internal.h > +++ b/fs/erofs/internal.h > @@ -155,6 +155,7 @@ struct erofs_sb_info { > > /* fscache support */ > struct fscache_volume *volume; > + struct erofs_fscache *s_fscache; > }; > > #define EROFS_SB(sb) ((struct erofs_sb_info *)(sb)->s_fs_info) > diff --git a/fs/erofs/super.c b/fs/erofs/super.c > index 6590ed1b7d3b..9498b899b73b 100644 > --- a/fs/erofs/super.c > +++ b/fs/erofs/super.c > @@ -585,6 +585,9 @@ static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc) > int err; > > sb->s_magic = EROFS_SUPER_MAGIC; > + sb->s_flags |= SB_RDONLY | SB_NOATIME; > + sb->s_maxbytes = MAX_LFS_FILESIZE; > + sb->s_op = &erofs_sops; > > if (!sb_set_blocksize(sb, EROFS_BLKSIZ)) { > erofs_err(sb, "failed to set erofs blksize"); > @@ -605,6 +608,11 @@ static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc) > err = erofs_fscache_register_fs(sb); > if (err) > return err; > + > + err = erofs_fscache_register_cookie(sb, &sbi->s_fscache, > + sbi->opt.fsid, true); > + if (err) > + return err; > } > > err = erofs_read_superblock(sb); > @@ -619,11 +627,8 @@ static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc) > clear_opt(&sbi->opt, DAX_ALWAYS); > } > } > - sb->s_flags |= SB_RDONLY | SB_NOATIME; > - sb->s_maxbytes = MAX_LFS_FILESIZE; > - sb->s_time_gran = 1; > > - sb->s_op = &erofs_sops; > + sb->s_time_gran = 1; > sb->s_xattr = erofs_xattr_handlers; > > if (test_opt(&sbi->opt, POSIX_ACL)) > @@ -763,6 +768,7 @@ static void erofs_kill_sb(struct super_block *sb) > > erofs_free_dev_context(sbi->devs); > fs_put_dax(sbi->dax_dev); > + erofs_fscache_unregister_cookie(&sbi->s_fscache); > erofs_fscache_unregister_fs(sb); > kfree(sbi); > sb->s_fs_info = NULL; > @@ -781,6 +787,7 @@ static void erofs_put_super(struct super_block *sb) > iput(sbi->managed_cache); > sbi->managed_cache = NULL; > #endif > + erofs_fscache_unregister_cookie(&sbi->s_fscache); > } > > static struct file_system_type erofs_fs_type = { > -- > 2.27.0 > -- Linux-cachefs mailing list Linux-cachefs@xxxxxxxxxx https://listman.redhat.com/mailman/listinfo/linux-cachefs