[PATCH 27/43] xfs_db: dump rt summary blocks

Darrick J. Wong
2024-10-11T01:31:36Z

Now that rtsummary blocks have a header, make it so that xfs_db can
analyze the structure.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
---
db/field.c | 4 ++++
db/field.h | 2 ++
db/inode.c | 2 ++
db/rtgroup.c | 20 ++++++++++++++++++++
db/rtgroup.h | 3 +++
db/type.c | 5 +++++
db/type.h | 1 +
7 files changed, 37 insertions(+)

diff --git a/db/field.c b/db/field.c
index ad1ccb9877aca5..ca0fe1826f9a80 100644
--- a/db/field.c
+++ b/db/field.c
@@ -411,6 +411,10 @@ const ftattr_t ftattrtab[] = {
0, NULL, NULL },
{ FLDT_RGBITMAP, "rgbitmap", NULL, (char *)rgbitmap_flds, btblock_size,
FTARG_SIZE, NULL, rgbitmap_flds },
+ { FLDT_SUMINFO, "suminfo", fp_num, "%u", SI(bitsz(xfs_suminfo_t)),
+ 0, NULL, NULL },
+ { FLDT_RGSUMMARY, "rgsummary", NULL, (char *)rgsummary_flds,
+ btblock_size, FTARG_SIZE, NULL, rgsummary_flds },

{ FLDT_ZZZ, NULL }
};
diff --git a/db/field.h b/db/field.h
index aace89c90d79eb..1d7465b4d3e562 100644
--- a/db/field.h
+++ b/db/field.h
@@ -198,6 +198,8 @@ typedef enum fldt {

FLDT_RTWORD,
FLDT_RGBITMAP,
+ FLDT_SUMINFO,
+ FLDT_RGSUMMARY,

FLDT_ZZZ /* mark last entry */
} fldt_t;
diff --git a/db/inode.c b/db/inode.c
index 0ecfdd18058c79..1acb642ce6f28b 100644
--- a/db/inode.c
+++ b/db/inode.c
@@ -715,6 +715,8 @@ inode_next_type(void)
return TYP_DQBLK;
case XFS_METAFILE_RTBITMAP:
return TYP_RGBITMAP;
+ case XFS_METAFILE_RTSUMMARY:
+ return TYP_RGSUMMARY;
default:
return TYP_DATA;
}
diff --git a/db/rtgroup.c b/db/rtgroup.c
index 3ef2dc8fe7f031..c6b96c9dc79daa 100644
--- a/db/rtgroup.c
+++ b/db/rtgroup.c
@@ -132,3 +132,23 @@ const field_t rgbitmap_hfld[] = {
{ "", FLDT_RGBITMAP, OI(0), C1, 0, TYP_NONE },
{ NULL }
};
+
+#define OFF(f) bitize(offsetof(struct xfs_rtbuf_blkinfo, rt_ ## f))
+const field_t rgsummary_flds[] = {
+ { "magicnum", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE },
+ { "crc", FLDT_CRC, OI(OFF(crc)), C1, 0, TYP_NONE },
+ { "owner", FLDT_INO, OI(OFF(owner)), C1, 0, TYP_NONE },
+ { "bno", FLDT_DFSBNO, OI(OFF(blkno)), C1, 0, TYP_BMAPBTD },
+ { "lsn", FLDT_UINT64X, OI(OFF(lsn)), C1, 0, TYP_NONE },
+ { "uuid", FLDT_UUID, OI(OFF(uuid)), C1, 0, TYP_NONE },
+ /* the suminfo array is after the actual structure */
+ { "suminfo", FLDT_SUMINFO, OI(bitize(sizeof(struct xfs_rtbuf_blkinfo))),
+ rtwords_count, FLD_ARRAY | FLD_COUNT, TYP_DATA },
+ { NULL }
+};
+#undef OFF
+
+const field_t rgsummary_hfld[] = {
+ { "", FLDT_RGSUMMARY, OI(0), C1, 0, TYP_NONE },
+ { NULL }
+};
diff --git a/db/rtgroup.h b/db/rtgroup.h
index 06f554e1862851..5b120f2c9a29f3 100644
--- a/db/rtgroup.h
+++ b/db/rtgroup.h
@@ -12,6 +12,9 @@ extern const struct field rtsb_hfld[];
extern const struct field rgbitmap_flds[];
extern const struct field rgbitmap_hfld[];

+extern const struct field rgsummary_flds[];
+extern const struct field rgsummary_hfld[];
+
extern void rtsb_init(void);
extern int rtsb_size(void *obj, int startoff, int idx);

diff --git a/db/type.c b/db/type.c
index 65e7b24146f170..2091b4ac8b139b 100644
--- a/db/type.c
+++ b/db/type.c
@@ -68,6 +68,7 @@ static const typ_t __typtab[] = {
{ TYP_FINOBT, "finobt", handle_struct, finobt_hfld, NULL,
TYP_F_NO_CRC_OFF },
{ TYP_RGBITMAP, NULL },
+ { TYP_RGSUMMARY, NULL },
{ TYP_NONE, NULL }
};

@@ -116,6 +117,8 @@ static const typ_t __typtab_crc[] = {
&xfs_finobt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF },
{ TYP_RGBITMAP, "rgbitmap", handle_struct, rgbitmap_hfld,
&xfs_rtbitmap_buf_ops, XFS_RTBUF_CRC_OFF },
+ { TYP_RGSUMMARY, "rgsummary", handle_struct, rgsummary_hfld,
+ &xfs_rtsummary_buf_ops, XFS_RTBUF_CRC_OFF },
{ TYP_NONE, NULL }
};

@@ -164,6 +167,8 @@ static const typ_t __typtab_spcrc[] = {
&xfs_finobt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF },
{ TYP_RGBITMAP, "rgbitmap", handle_struct, rgbitmap_hfld,
&xfs_rtbitmap_buf_ops, XFS_RTBUF_CRC_OFF },
+ { TYP_RGSUMMARY, "rgsummary", handle_struct, rgsummary_hfld,
+ &xfs_rtsummary_buf_ops, XFS_RTBUF_CRC_OFF },
{ TYP_NONE, NULL }
};

diff --git a/db/type.h b/db/type.h
index e2148c6351d141..e7f0ecc17680bf 100644
--- a/db/type.h
+++ b/db/type.h
@@ -36,6 +36,7 @@ typedef enum typnm
TYP_TEXT,
TYP_FINOBT,
TYP_RGBITMAP,
+ TYP_RGSUMMARY,
TYP_NONE
} typnm_t;