erofs-utils: dump: print more superblock fields
authorGuo Xuenan <guoxuenan@huawei.com>
Tue, 8 Aug 2023 09:23:35 +0000 (17:23 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Tue, 8 Aug 2023 18:27:51 +0000 (02:27 +0800)
Let's print compression algorithms and sb_extslots as well as update
feature information for dump.erofs.

The proposed superblock dump is shown as below:

Filesystem magic number:                      0xE0F5E1E2
Filesystem blocks:                            4624
Filesystem inode metadata start block:        0
Filesystem shared xattr metadata start block: 0
Filesystem root nid:                          37
Filesystem compr_algs:                        lz4, lzma
Filesystem sb_extslots:                       0
Filesystem inode count:                       6131
Filesystem created:                           Wed Jun  7 17:15:44 2023
Filesystem features:                          sb_csum mtime 0padding compr_cfgs big_pcluster
Filesystem UUID:                              not available

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

index 409c851dfca10063dc20bd7074d5a1e173fc195f..7980f7896956dbaac61db5f0e18b2ba5f242a941 100644 (file)
@@ -92,12 +92,14 @@ static struct erofsdump_feature feature_lists[] = {
        { true, EROFS_FEATURE_COMPAT_SB_CHKSUM, "sb_csum" },
        { true, EROFS_FEATURE_COMPAT_MTIME, "mtime" },
        { false, EROFS_FEATURE_INCOMPAT_ZERO_PADDING, "0padding" },
+       { false, EROFS_FEATURE_INCOMPAT_COMPR_CFGS, "compr_cfgs" },
        { false, EROFS_FEATURE_INCOMPAT_BIG_PCLUSTER, "big_pcluster" },
        { false, EROFS_FEATURE_INCOMPAT_CHUNKED_FILE, "chunked_file" },
        { false, EROFS_FEATURE_INCOMPAT_DEVICE_TABLE, "device_table" },
        { false, EROFS_FEATURE_INCOMPAT_ZTAILPACKING, "ztailpacking" },
        { false, EROFS_FEATURE_INCOMPAT_FRAGMENTS, "fragments" },
        { false, EROFS_FEATURE_INCOMPAT_DEDUPE, "dedupe" },
+       { false, EROFS_FEATURE_INCOMPAT_XATTR_PREFIXES, "xattr_prefixes" },
 };
 
 static int erofsdump_readdir(struct erofs_dir_context *ctx);
@@ -588,6 +590,23 @@ static void erofsdump_print_statistic(void)
        erofsdump_filetype_distribution(file_types, OTHERFILETYPE);
 }
 
+static void erofsdump_print_supported_compressors(FILE *f, unsigned int mask)
+{
+       unsigned int i = 0;
+       bool comma = false;
+       const char *s;
+
+       while ((s = z_erofs_list_supported_algorithms(i++, &mask)) != NULL) {
+               if (*s == '\0')
+                       continue;
+               if (comma)
+                       fputs(", ", f);
+               fputs(s, f);
+               comma = true;
+       }
+       fputc('\n', f);
+}
+
 static void erofsdump_show_superblock(void)
 {
        time_t time = sbi.build_time;
@@ -607,6 +626,16 @@ static void erofsdump_show_superblock(void)
        if (erofs_sb_has_fragments(&sbi) && sbi.packed_nid > 0)
                fprintf(stdout, "Filesystem packed nid:                        %llu\n",
                        sbi.packed_nid | 0ULL);
+       if (erofs_sb_has_compr_cfgs(&sbi)) {
+               fprintf(stdout, "Filesystem compr_algs:                        ");
+               erofsdump_print_supported_compressors(stdout,
+                       sbi.available_compr_algs);
+       } else {
+               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 inode count:                       %llu\n",
                        sbi.inos | 0ULL);
        fprintf(stdout, "Filesystem created:                           %s",
index 04a9a695235014954d3c34802957690e87ec3068..a04e6a6e5dfd15b4c4de10877d6998f947b14d0d 100644 (file)
@@ -74,6 +74,7 @@ struct erofs_sb_info {
        u64 build_time;
        u32 build_time_nsec;
 
+       u8  extslots;
        unsigned char islotbits;
        unsigned char blkszbits;
 
index 16a1d62a3a4cc6c469848989677e017045a026ab..e8e84aa707c22b86f773f4d4e20de04f0681661b 100644 (file)
@@ -106,11 +106,17 @@ 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);
 
        memcpy(&sbi->uuid, dsb->uuid, sizeof(dsb->uuid));
+
+       if (erofs_sb_has_compr_cfgs(sbi))
+               sbi->available_compr_algs = le16_to_cpu(dsb->u1.available_compr_algs);
+       else
+               sbi->lz4_max_distance = le16_to_cpu(dsb->u1.lz4_max_distance);
        return erofs_init_devices(sbi, dsb);
 }