Commit 7b00af2c authored by Gao Xiang's avatar Gao Xiang
Browse files

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: default avatarChao Yu <chao@kernel.org>
Signed-off-by: default avatarGao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241216125310.930933-2-hsiangkao@linux.alibaba.com
parent e2de3c1b
Loading
Loading
Loading
Loading
+4 −8
Original line number Diff line number Diff line
@@ -56,10 +56,10 @@ void erofs_init_metabuf(struct erofs_buf *buf, struct super_block *sb)

	buf->file = NULL;
	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;
	} else if (erofs_is_fscache_mode(sb))
		buf->mapping = sbi->s_fscache->inode->i_mapping;
		buf->mapping = sbi->dif0.fscache->inode->i_mapping;
	else
		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;
	int id;

	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;
	map->m_fp = EROFS_SB(sb)->fdev;

	erofs_fill_from_devinfo(map, &EROFS_SB(sb)->dif0);
	map->m_bdev = sb->s_bdev;	/* use s_bdev for the primary device */
	if (map->m_deviceid) {
		down_read(&devs->rwsem);
		dif = idr_find(&devs->tree, map->m_deviceid - 1);
+3 −3
Original line number Diff line number Diff line
@@ -657,7 +657,7 @@ int erofs_fscache_register_fs(struct super_block *sb)
	if (IS_ERR(fscache))
		return PTR_ERR(fscache);

	sbi->s_fscache = fscache;
	sbi->dif0.fscache = fscache;
	return 0;
}

@@ -665,14 +665,14 @@ void erofs_fscache_unregister_fs(struct super_block *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)
		erofs_fscache_domain_put(sbi->domain);
	else
		fscache_relinquish_volume(sbi->volume, NULL, false);

	sbi->s_fscache = NULL;
	sbi->dif0.fscache = NULL;
	sbi->volume = NULL;
	sbi->domain = NULL;
}
+2 −6
Original line number Diff line number Diff line
@@ -107,6 +107,7 @@ struct erofs_xattr_prefix_item {
};

struct erofs_sb_info {
	struct erofs_device_info dif0;
	struct erofs_mount_opts opt;	/* options */
#ifdef CONFIG_EROFS_FS_ZIP
	/* list for all registered superblocks, mainly for shrinker */
@@ -124,13 +125,9 @@ struct erofs_sb_info {

	struct erofs_sb_lz4_info lz4;
#endif	/* CONFIG_EROFS_FS_ZIP */
	struct file *fdev;
	struct inode *packed_inode;
	struct erofs_dev_context *devs;
	struct dax_device *dax_dev;
	u64 dax_part_off;
	u64 total_blocks;
	u32 primarydevice_blocks;

	u32 meta_blkaddr;
#ifdef CONFIG_EROFS_FS_XATTR
@@ -166,7 +163,6 @@ struct erofs_sb_info {

	/* fscache support */
	struct fscache_volume *volume;
	struct erofs_fscache *s_fscache;
	struct erofs_domain *domain;
	char *fsid;
	char *domain_id;
@@ -187,7 +183,7 @@ struct erofs_sb_info {

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)
+13 −14
Original line number Diff line number Diff line
@@ -203,7 +203,7 @@ static int erofs_scan_devices(struct super_block *sb,
	struct erofs_device_info *dif;
	int id, err = 0;

	sbi->total_blocks = sbi->primarydevice_blocks;
	sbi->total_blocks = sbi->dif0.blocks;
	if (!erofs_sb_has_device_table(sbi))
		ondisk_extradevs = 0;
	else
@@ -307,7 +307,7 @@ static int erofs_read_superblock(struct super_block *sb)
			  sbi->sb_size);
		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);
#ifdef CONFIG_EROFS_FS_XATTR
	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;
		}

		sbi->dax_dev = fs_dax_get_by_bdev(sb->s_bdev,
						  &sbi->dax_part_off,
						  NULL, NULL);
		sbi->dif0.dax_dev = fs_dax_get_by_bdev(sb->s_bdev,
				&sbi->dif0.dax_part_off, NULL, NULL);
	}

	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 (!sbi->dax_dev) {
		if (!sbi->dif0.dax_dev) {
			errorfc(fc, "DAX unsupported by block device. Turning off DAX.");
			clear_opt(&sbi->opt, DAX_ALWAYS);
		} else if (sbi->blkszbits != PAGE_SHIFT) {
@@ -707,14 +706,13 @@ static int erofs_fc_get_tree(struct fs_context *fc)

		if (!fc->source)
			return invalf(fc, "No source specified");

		file = filp_open(fc->source, O_RDONLY | O_LARGEFILE, 0);
		if (IS_ERR(file))
			return PTR_ERR(file);
		sbi->fdev = file;
		sbi->dif0.file = file;

		if (S_ISREG(file_inode(sbi->fdev)->i_mode) &&
		    sbi->fdev->f_mapping->a_ops->read_folio)
		if (S_ISREG(file_inode(sbi->dif0.file)->i_mode) &&
		    sbi->dif0.file->f_mapping->a_ops->read_folio)
			return get_tree_nodev(fc, erofs_fc_fill_super);
	}
#endif
@@ -771,8 +769,8 @@ static void erofs_sb_free(struct erofs_sb_info *sbi)
	erofs_free_dev_context(sbi->devs);
	kfree(sbi->fsid);
	kfree(sbi->domain_id);
	if (sbi->fdev)
		fput(sbi->fdev);
	if (sbi->dif0.file)
		fput(sbi->dif0.file);
	kfree(sbi);
}

@@ -817,11 +815,12 @@ static void erofs_kill_sb(struct super_block *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);
	else
		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_sb_free(sbi);
	sb->s_fs_info = NULL;