[PATCH] erofs-utils: dump: add some superblock fields display

Guo Xuenan guoxuenan at huawei.com
Tue Jun 6 13:55:11 AEST 2023


dump.erofs show compression algothrims and sb_exslots,
and update feature information.

th current super block info displayed as follows:
Filesystem magic number:                      0xE0F5E1E2
Filesystem blocks:                            4637
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:                       36
Filesystem created:                           Tue Jun  6 10:23:02 2023
Filesystem features:                          sb_csum mtime lz4_0padding compr_cfgs big_pcluster
Filesystem UUID:                              not available

Signed-off-by: Guo Xuenan <guoxuenan at huawei.com>
---
 dump/main.c              | 34 +++++++++++++++++++++++++++++++++-
 include/erofs/internal.h |  1 +
 lib/super.c              |  5 +++++
 3 files changed, 39 insertions(+), 1 deletion(-)

diff --git a/dump/main.c b/dump/main.c
index efbc82b..20e1456 100644
--- a/dump/main.c
+++ b/dump/main.c
@@ -93,13 +93,25 @@ struct erofsdump_feature {
 static struct erofsdump_feature feature_lists[] = {
 	{ true, EROFS_FEATURE_COMPAT_SB_CHKSUM, "sb_csum" },
 	{ true, EROFS_FEATURE_COMPAT_MTIME, "mtime" },
-	{ false, EROFS_FEATURE_INCOMPAT_LZ4_0PADDING, "0padding" },
+	{ false, EROFS_FEATURE_INCOMPAT_LZ4_0PADDING, "lz4_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" },
+};
+
+struct available_alg {
+	int type;
+	const char *name;
+};
+
+static struct available_alg compr_cfgs[] = {
+	{ Z_EROFS_COMPRESSION_LZ4, "lz4" },
+	{ Z_EROFS_COMPRESSION_LZMA, "lzma" },
 };
 
 static int erofsdump_readdir(struct erofs_dir_context *ctx);
@@ -590,6 +602,17 @@ static void erofsdump_print_statistic(void)
 	erofsdump_filetype_distribution(file_types, OTHERFILETYPE);
 }
 
+static void erofsdump_show_comprcfgs(void)
+{
+	int i = 0;
+
+	for (; i < ARRAY_SIZE(compr_cfgs); i++) {
+		if (sbi.available_compr_algs & (1 << compr_cfgs[i].type))
+			fprintf(stdout, "%s ", compr_cfgs[i].name);
+	}
+	fprintf(stdout, "\n");
+}
+
 static void erofsdump_show_superblock(void)
 {
 	time_t time = sbi.build_time;
@@ -609,6 +632,15 @@ static void erofsdump_show_superblock(void)
 	if (erofs_sb_has_fragments() && sbi.packed_nid > 0)
 		fprintf(stdout, "Filesystem packed nid:                        %llu\n",
 			sbi.packed_nid | 0ULL);
+	if (erofs_sb_has_compr_cfgs()) {
+		fprintf(stdout, "Filesystem compr_algs:                        ");
+		erofsdump_show_comprcfgs();
+	} else {
+		fprintf(stdout, "Filesystem lz4_max_dist:                      %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",
diff --git a/include/erofs/internal.h b/include/erofs/internal.h
index 370cfac..a404008 100644
--- a/include/erofs/internal.h
+++ b/include/erofs/internal.h
@@ -74,6 +74,7 @@ struct erofs_sb_info {
 	u32 feature_incompat;
 	u64 build_time;
 	u32 build_time_nsec;
+	u8 extslots;
 
 	unsigned char islotbits;
 	unsigned char blkszbits;
diff --git a/lib/super.c b/lib/super.c
index 5f70686..f511b7d 100644
--- a/lib/super.c
+++ b/lib/super.c
@@ -105,11 +105,16 @@ int erofs_read_superblock(void)
 	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.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);
 }
 
-- 
2.31.1



More information about the Linux-erofs mailing list