erofs-utils: record sb_size instead of sb_extslots
authorGao Xiang <hsiangkao@linux.alibaba.com>
Tue, 4 Jun 2024 08:40:15 +0000 (16:40 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Tue, 4 Jun 2024 09:00:22 +0000 (17:00 +0800)
Just follow the kernel implementation.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240604084015.2291157-2-hsiangkao@linux.alibaba.com
dump/main.c
include/erofs/internal.h
lib/super.c

index dd2c620c4ca85c661cfdce6f063628bae07236ba..50f46629f892ba07de467cd26adeb72c7be33fd6 100644 (file)
@@ -654,8 +654,8 @@ static void erofsdump_show_superblock(void)
                fprintf(stdout, "Filesystem lz4_max_distance:                  %u\n",
                        sbi.lz4_max_distance | 0U);
        }
-       fprintf(stdout, "Filesystem sb_extslots:                       %u\n",
-                       sbi.extslots | 0U);
+       fprintf(stdout, "Filesystem sb_size:                           %u\n",
+                       sbi.sb_size | 0U);
        fprintf(stdout, "Filesystem inode count:                       %llu\n",
                        sbi.inos | 0ULL);
        fprintf(stdout, "Filesystem created:                           %s",
index 46345e0537a140af1affc59157dc2303520430e7..9fdff7101056bb073e4fb5ae25c1ecc0e3226350 100644 (file)
@@ -84,13 +84,14 @@ struct erofs_sb_info {
 
        u32 feature_compat;
        u32 feature_incompat;
-       u64 build_time;
-       u32 build_time_nsec;
 
-       u8  extslots;
        unsigned char islotbits;
        unsigned char blkszbits;
 
+       u32 sb_size;                    /* total superblock size */
+       u32 build_time_nsec;
+       u64 build_time;
+
        /* what we really care is nid, rather than ino.. */
        erofs_nid_t root_nid;
        /* used for statfs, f_files - f_favail */
index f952f7ed41bb763fe8d014b4aa056330438412a4..4d16d29a57b9d8fae92e070d659d0b772820b21a 100644 (file)
@@ -104,6 +104,12 @@ int erofs_read_superblock(struct erofs_sb_info *sbi)
                return ret;
        }
 
+       sbi->sb_size = 128 + dsb->sb_extslots * EROFS_SB_EXTSLOT_SIZE;
+       if (sbi->sb_size > (1 << sbi->blkszbits) - EROFS_SUPER_OFFSET) {
+               erofs_err("invalid sb_extslots %u (more than a fs block)",
+                         dsb->sb_extslots);
+               return -EINVAL;
+       }
        sbi->primarydevice_blocks = le32_to_cpu(dsb->blocks);
        sbi->meta_blkaddr = le32_to_cpu(dsb->meta_blkaddr);
        sbi->xattr_blkaddr = le32_to_cpu(dsb->xattr_blkaddr);
@@ -114,7 +120,6 @@ int erofs_read_superblock(struct erofs_sb_info *sbi)
        sbi->packed_nid = le64_to_cpu(dsb->packed_nid);
        sbi->inos = le64_to_cpu(dsb->inos);
        sbi->checksum = le32_to_cpu(dsb->checksum);
-       sbi->extslots = dsb->sb_extslots;
 
        sbi->build_time = le64_to_cpu(dsb->build_time);
        sbi->build_time_nsec = le32_to_cpu(dsb->build_time_nsec);