On Wed, Apr 06, 2022 at 03:56:07PM +0800, Jeffle Xu wrote: > Similar to the multi device mode, erofs could be mounted from one > primary data blob (mandatory) and multiple extra data blobs (optional). > > Register fscache context for each extra data blob. > > Signed-off-by: Jeffle Xu <jefflexu@xxxxxxxxxxxxxxxxx> > --- > fs/erofs/data.c | 3 +++ > fs/erofs/internal.h | 2 ++ > fs/erofs/super.c | 25 +++++++++++++++++-------- > 3 files changed, 22 insertions(+), 8 deletions(-) > > diff --git a/fs/erofs/data.c b/fs/erofs/data.c > index bc22642358ec..14b64d960541 100644 > --- a/fs/erofs/data.c > +++ b/fs/erofs/data.c > @@ -199,6 +199,7 @@ int erofs_map_dev(struct super_block *sb, struct erofs_map_dev *map) > map->m_bdev = sb->s_bdev; > map->m_daxdev = EROFS_SB(sb)->dax_dev; > map->m_dax_part_off = EROFS_SB(sb)->dax_part_off; > + map->m_fscache = EROFS_SB(sb)->s_fscache; > > if (map->m_deviceid) { > down_read(&devs->rwsem); > @@ -210,6 +211,7 @@ int erofs_map_dev(struct super_block *sb, struct erofs_map_dev *map) > map->m_bdev = dif->bdev; > map->m_daxdev = dif->dax_dev; > map->m_dax_part_off = dif->dax_part_off; > + map->m_fscache = dif->fscache; > up_read(&devs->rwsem); > } else if (devs->extra_devices) { > down_read(&devs->rwsem); > @@ -227,6 +229,7 @@ int erofs_map_dev(struct super_block *sb, struct erofs_map_dev *map) > map->m_bdev = dif->bdev; > map->m_daxdev = dif->dax_dev; > map->m_dax_part_off = dif->dax_part_off; > + map->m_fscache = dif->fscache; > break; > } > } > diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h > index eb37b33bce37..90f7d6286a4f 100644 > --- a/fs/erofs/internal.h > +++ b/fs/erofs/internal.h > @@ -49,6 +49,7 @@ typedef u32 erofs_blk_t; > > struct erofs_device_info { > char *path; > + struct erofs_fscache *fscache; > struct block_device *bdev; > struct dax_device *dax_dev; > u64 dax_part_off; > @@ -482,6 +483,7 @@ static inline int z_erofs_map_blocks_iter(struct inode *inode, > #endif /* !CONFIG_EROFS_FS_ZIP */ > > struct erofs_map_dev { > + struct erofs_fscache *m_fscache; > struct block_device *m_bdev; > struct dax_device *m_daxdev; > u64 m_dax_part_off; > diff --git a/fs/erofs/super.c b/fs/erofs/super.c > index 9498b899b73b..8c7181cd37e6 100644 > --- a/fs/erofs/super.c > +++ b/fs/erofs/super.c > @@ -259,15 +259,23 @@ static int erofs_init_devices(struct super_block *sb, > } > dis = ptr + erofs_blkoff(pos); > > - bdev = blkdev_get_by_path(dif->path, > - FMODE_READ | FMODE_EXCL, > - sb->s_type); > - if (IS_ERR(bdev)) { > - err = PTR_ERR(bdev); > - break; > + if (erofs_is_fscache_mode(sb)) { > + err = erofs_fscache_register_cookie(sb, &dif->fscache, > + dif->path, false); > + if (err) > + break; > + } else { > + bdev = blkdev_get_by_path(dif->path, > + FMODE_READ | FMODE_EXCL, > + sb->s_type); > + if (IS_ERR(bdev)) { > + err = PTR_ERR(bdev); > + break; > + } > + dif->bdev = bdev; > + dif->dax_dev = fs_dax_get_by_bdev(bdev, &dif->dax_part_off); Overly long line, please help split into 2 lines if possible. Otherwise looks good, Reviewed-by: Gao Xiang <hsiangkao@xxxxxxxxxxxxxxxxx> Thanks, Gao Xiang > } > - dif->bdev = bdev; > - dif->dax_dev = fs_dax_get_by_bdev(bdev, &dif->dax_part_off); > + > dif->blocks = le32_to_cpu(dis->blocks); > dif->mapped_blkaddr = le32_to_cpu(dis->mapped_blkaddr); > sbi->total_blocks += dif->blocks; > @@ -701,6 +709,7 @@ static int erofs_release_device_info(int id, void *ptr, void *data) > fs_put_dax(dif->dax_dev); > if (dif->bdev) > blkdev_put(dif->bdev, FMODE_READ | FMODE_EXCL); > + erofs_fscache_unregister_cookie(&dif->fscache); > kfree(dif->path); > kfree(dif); > return 0; > -- > 2.27.0 > -- Linux-cachefs mailing list Linux-cachefs@xxxxxxxxxx https://listman.redhat.com/mailman/listinfo/linux-cachefs