On 4/7/22 10:15 PM, Gao Xiang wrote: > 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. > Will be fixed in the next version. -- Thanks, Jeffle