]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
erofs: use `struct erofs_device_info` for the primary device
authorGao Xiang <hsiangkao@linux.alibaba.com>
Mon, 16 Dec 2024 12:53:08 +0000 (20:53 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Mon, 16 Dec 2024 13:01:59 +0000 (21:01 +0800)
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
fs/erofs/data.c
fs/erofs/fscache.c
fs/erofs/internal.h
fs/erofs/super.c

index 1c49f8962021f4fb975644ca38cc6fa0768151e0..622017c659587a3862118c58813e240002261500 100644 (file)
@@ -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);
index fda16eedafb57858adeea0f15c9736044ba8239f..ce7e38c827198fea088694dcf703ca10a12bf389 100644 (file)
@@ -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;
 }
index 1c847c30a918f5813fd76c1a8e695546cd906c64..3e8d71d516f424195903d187bdbe03a244721c73 100644 (file)
@@ -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)
index de8e3ecc6381d052f96d9f32cad2cd0f27276ec1..9044907354e1262124708ac1107103198e093fee 100644 (file)
@@ -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;