erofs: use struct erofs_device_info for the primary device

Instead of just listing each one directly in `struct erofs_sb_info`
except that we still use `sb->s_bdev` for the primary block device.

Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241216125310.930933-2-hsiangkao@linux.alibaba.com
This commit is contained in:
Gao Xiang 2024-12-16 20:53:08 +08:00
parent e2de3c1bf6
commit 7b00af2c54
4 changed files with 22 additions and 31 deletions

View File

@ -56,10 +56,10 @@ void erofs_init_metabuf(struct erofs_buf *buf, struct super_block *sb)
buf->file = NULL; buf->file = NULL;
if (erofs_is_fileio_mode(sbi)) { if (erofs_is_fileio_mode(sbi)) {
buf->file = sbi->fdev; /* some fs like FUSE needs it */ buf->file = sbi->dif0.file; /* some fs like FUSE needs it */
buf->mapping = buf->file->f_mapping; buf->mapping = buf->file->f_mapping;
} else if (erofs_is_fscache_mode(sb)) } else if (erofs_is_fscache_mode(sb))
buf->mapping = sbi->s_fscache->inode->i_mapping; buf->mapping = sbi->dif0.fscache->inode->i_mapping;
else else
buf->mapping = sb->s_bdev->bd_mapping; buf->mapping = sb->s_bdev->bd_mapping;
} }
@ -201,12 +201,8 @@ int erofs_map_dev(struct super_block *sb, struct erofs_map_dev *map)
erofs_off_t startoff, length; erofs_off_t startoff, length;
int id; int id;
map->m_bdev = sb->s_bdev; erofs_fill_from_devinfo(map, &EROFS_SB(sb)->dif0);
map->m_daxdev = EROFS_SB(sb)->dax_dev; map->m_bdev = sb->s_bdev; /* use s_bdev for the primary device */
map->m_dax_part_off = EROFS_SB(sb)->dax_part_off;
map->m_fscache = EROFS_SB(sb)->s_fscache;
map->m_fp = EROFS_SB(sb)->fdev;
if (map->m_deviceid) { if (map->m_deviceid) {
down_read(&devs->rwsem); down_read(&devs->rwsem);
dif = idr_find(&devs->tree, map->m_deviceid - 1); dif = idr_find(&devs->tree, map->m_deviceid - 1);

View File

@ -657,7 +657,7 @@ int erofs_fscache_register_fs(struct super_block *sb)
if (IS_ERR(fscache)) if (IS_ERR(fscache))
return PTR_ERR(fscache); return PTR_ERR(fscache);
sbi->s_fscache = fscache; sbi->dif0.fscache = fscache;
return 0; return 0;
} }
@ -665,14 +665,14 @@ void erofs_fscache_unregister_fs(struct super_block *sb)
{ {
struct erofs_sb_info *sbi = EROFS_SB(sb); struct erofs_sb_info *sbi = EROFS_SB(sb);
erofs_fscache_unregister_cookie(sbi->s_fscache); erofs_fscache_unregister_cookie(sbi->dif0.fscache);
if (sbi->domain) if (sbi->domain)
erofs_fscache_domain_put(sbi->domain); erofs_fscache_domain_put(sbi->domain);
else else
fscache_relinquish_volume(sbi->volume, NULL, false); fscache_relinquish_volume(sbi->volume, NULL, false);
sbi->s_fscache = NULL; sbi->dif0.fscache = NULL;
sbi->volume = NULL; sbi->volume = NULL;
sbi->domain = NULL; sbi->domain = NULL;
} }

View File

@ -107,6 +107,7 @@ struct erofs_xattr_prefix_item {
}; };
struct erofs_sb_info { struct erofs_sb_info {
struct erofs_device_info dif0;
struct erofs_mount_opts opt; /* options */ struct erofs_mount_opts opt; /* options */
#ifdef CONFIG_EROFS_FS_ZIP #ifdef CONFIG_EROFS_FS_ZIP
/* list for all registered superblocks, mainly for shrinker */ /* list for all registered superblocks, mainly for shrinker */
@ -124,13 +125,9 @@ struct erofs_sb_info {
struct erofs_sb_lz4_info lz4; struct erofs_sb_lz4_info lz4;
#endif /* CONFIG_EROFS_FS_ZIP */ #endif /* CONFIG_EROFS_FS_ZIP */
struct file *fdev;
struct inode *packed_inode; struct inode *packed_inode;
struct erofs_dev_context *devs; struct erofs_dev_context *devs;
struct dax_device *dax_dev;
u64 dax_part_off;
u64 total_blocks; u64 total_blocks;
u32 primarydevice_blocks;
u32 meta_blkaddr; u32 meta_blkaddr;
#ifdef CONFIG_EROFS_FS_XATTR #ifdef CONFIG_EROFS_FS_XATTR
@ -166,7 +163,6 @@ struct erofs_sb_info {
/* fscache support */ /* fscache support */
struct fscache_volume *volume; struct fscache_volume *volume;
struct erofs_fscache *s_fscache;
struct erofs_domain *domain; struct erofs_domain *domain;
char *fsid; char *fsid;
char *domain_id; char *domain_id;
@ -187,7 +183,7 @@ struct erofs_sb_info {
static inline bool erofs_is_fileio_mode(struct erofs_sb_info *sbi) static inline bool erofs_is_fileio_mode(struct erofs_sb_info *sbi)
{ {
return IS_ENABLED(CONFIG_EROFS_FS_BACKED_BY_FILE) && sbi->fdev; return IS_ENABLED(CONFIG_EROFS_FS_BACKED_BY_FILE) && sbi->dif0.file;
} }
static inline bool erofs_is_fscache_mode(struct super_block *sb) static inline bool erofs_is_fscache_mode(struct super_block *sb)

View File

@ -203,7 +203,7 @@ static int erofs_scan_devices(struct super_block *sb,
struct erofs_device_info *dif; struct erofs_device_info *dif;
int id, err = 0; int id, err = 0;
sbi->total_blocks = sbi->primarydevice_blocks; sbi->total_blocks = sbi->dif0.blocks;
if (!erofs_sb_has_device_table(sbi)) if (!erofs_sb_has_device_table(sbi))
ondisk_extradevs = 0; ondisk_extradevs = 0;
else else
@ -307,7 +307,7 @@ static int erofs_read_superblock(struct super_block *sb)
sbi->sb_size); sbi->sb_size);
goto out; goto out;
} }
sbi->primarydevice_blocks = le32_to_cpu(dsb->blocks); sbi->dif0.blocks = le32_to_cpu(dsb->blocks);
sbi->meta_blkaddr = le32_to_cpu(dsb->meta_blkaddr); sbi->meta_blkaddr = le32_to_cpu(dsb->meta_blkaddr);
#ifdef CONFIG_EROFS_FS_XATTR #ifdef CONFIG_EROFS_FS_XATTR
sbi->xattr_blkaddr = le32_to_cpu(dsb->xattr_blkaddr); sbi->xattr_blkaddr = le32_to_cpu(dsb->xattr_blkaddr);
@ -602,9 +602,8 @@ static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc)
return -EINVAL; return -EINVAL;
} }
sbi->dax_dev = fs_dax_get_by_bdev(sb->s_bdev, sbi->dif0.dax_dev = fs_dax_get_by_bdev(sb->s_bdev,
&sbi->dax_part_off, &sbi->dif0.dax_part_off, NULL, NULL);
NULL, NULL);
} }
err = erofs_read_superblock(sb); err = erofs_read_superblock(sb);
@ -627,7 +626,7 @@ static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc)
} }
if (test_opt(&sbi->opt, DAX_ALWAYS)) { if (test_opt(&sbi->opt, DAX_ALWAYS)) {
if (!sbi->dax_dev) { if (!sbi->dif0.dax_dev) {
errorfc(fc, "DAX unsupported by block device. Turning off DAX."); errorfc(fc, "DAX unsupported by block device. Turning off DAX.");
clear_opt(&sbi->opt, DAX_ALWAYS); clear_opt(&sbi->opt, DAX_ALWAYS);
} else if (sbi->blkszbits != PAGE_SHIFT) { } else if (sbi->blkszbits != PAGE_SHIFT) {
@ -707,14 +706,13 @@ static int erofs_fc_get_tree(struct fs_context *fc)
if (!fc->source) if (!fc->source)
return invalf(fc, "No source specified"); return invalf(fc, "No source specified");
file = filp_open(fc->source, O_RDONLY | O_LARGEFILE, 0); file = filp_open(fc->source, O_RDONLY | O_LARGEFILE, 0);
if (IS_ERR(file)) if (IS_ERR(file))
return PTR_ERR(file); return PTR_ERR(file);
sbi->fdev = file; sbi->dif0.file = file;
if (S_ISREG(file_inode(sbi->fdev)->i_mode) && if (S_ISREG(file_inode(sbi->dif0.file)->i_mode) &&
sbi->fdev->f_mapping->a_ops->read_folio) sbi->dif0.file->f_mapping->a_ops->read_folio)
return get_tree_nodev(fc, erofs_fc_fill_super); return get_tree_nodev(fc, erofs_fc_fill_super);
} }
#endif #endif
@ -771,8 +769,8 @@ static void erofs_sb_free(struct erofs_sb_info *sbi)
erofs_free_dev_context(sbi->devs); erofs_free_dev_context(sbi->devs);
kfree(sbi->fsid); kfree(sbi->fsid);
kfree(sbi->domain_id); kfree(sbi->domain_id);
if (sbi->fdev) if (sbi->dif0.file)
fput(sbi->fdev); fput(sbi->dif0.file);
kfree(sbi); kfree(sbi);
} }
@ -817,11 +815,12 @@ static void erofs_kill_sb(struct super_block *sb)
{ {
struct erofs_sb_info *sbi = EROFS_SB(sb); struct erofs_sb_info *sbi = EROFS_SB(sb);
if ((IS_ENABLED(CONFIG_EROFS_FS_ONDEMAND) && sbi->fsid) || sbi->fdev) if ((IS_ENABLED(CONFIG_EROFS_FS_ONDEMAND) && sbi->fsid) ||
sbi->dif0.file)
kill_anon_super(sb); kill_anon_super(sb);
else else
kill_block_super(sb); kill_block_super(sb);
fs_put_dax(sbi->dax_dev, NULL); fs_put_dax(sbi->dif0.dax_dev, NULL);
erofs_fscache_unregister_fs(sb); erofs_fscache_unregister_fs(sb);
erofs_sb_free(sbi); erofs_sb_free(sbi);
sb->s_fs_info = NULL; sb->s_fs_info = NULL;