]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_db: dump rt bitmap blocks
authorDarrick J. Wong <djwong@kernel.org>
Thu, 21 Nov 2024 00:24:38 +0000 (16:24 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 24 Dec 2024 02:01:34 +0000 (18:01 -0800)
Now that rtbitmap blocks have a header, make it so that xfs_db can
analyze the structure.

Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
db/field.c
db/field.h
db/inode.c
db/rtgroup.c
db/rtgroup.h
db/type.c
db/type.h

index f70955ef57a3234c577d29d21628e057be22beb1..ad1ccb9877aca5f9b0605f21c435af4f779c892a 100644 (file)
@@ -406,6 +406,12 @@ const ftattr_t     ftattrtab[] = {
        { FLDT_UUID, "uuid", fp_uuid, NULL, SI(bitsz(uuid_t)), 0, NULL, NULL },
        { FLDT_PARENT_REC, "parent", NULL, (char *)parent_flds,
          SI(bitsz(struct xfs_parent_rec)), 0, NULL, parent_flds },
+
+       { FLDT_RTWORD, "rtword", fp_num, "%#x", SI(bitsz(xfs_rtword_t)),
+         0, NULL, NULL },
+       { FLDT_RGBITMAP, "rgbitmap", NULL, (char *)rgbitmap_flds, btblock_size,
+         FTARG_SIZE, NULL, rgbitmap_flds },
+
        { FLDT_ZZZ, NULL }
 };
 
index 8797a75f669246d29543d85fed16519b7dda1bc9..aace89c90d79eb6379c29858e61ede1833d6b903 100644 (file)
@@ -196,6 +196,9 @@ typedef enum fldt   {
 
        FLDT_PARENT_REC,
 
+       FLDT_RTWORD,
+       FLDT_RGBITMAP,
+
        FLDT_ZZZ                        /* mark last entry */
 } fldt_t;
 
index 07efbb4902be089cc19bb5844a5192bea5e0ccc1..d3207510c2826565584441af81eff55023cae8ac 100644 (file)
@@ -705,16 +705,32 @@ inode_next_type(void)
        case S_IFLNK:
                return TYP_SYMLINK;
        case S_IFREG:
-               if (iocur_top->ino == mp->m_sb.sb_rbmino)
-                       return TYP_RTBITMAP;
-               else if (iocur_top->ino == mp->m_sb.sb_rsumino)
-                       return TYP_RTSUMMARY;
-               else if (iocur_top->ino == mp->m_sb.sb_uquotino ||
-                        iocur_top->ino == mp->m_sb.sb_gquotino ||
-                        iocur_top->ino == mp->m_sb.sb_pquotino)
+               if (xfs_has_rtgroups(mp)) {
+                       struct xfs_dinode       *dic = iocur_top->data;
+
+                       switch (be16_to_cpu(dic->di_metatype)) {
+                       case XFS_METAFILE_USRQUOTA:
+                       case XFS_METAFILE_GRPQUOTA:
+                       case XFS_METAFILE_PRJQUOTA:
+                               return TYP_DQBLK;
+                       case XFS_METAFILE_RTBITMAP:
+                               return TYP_RGBITMAP;
+                       default:
+                               return TYP_DATA;
+                       }
+               } else {
+                       if (iocur_top->ino == mp->m_sb.sb_rbmino)
+                               return TYP_RTBITMAP;
+                       if (iocur_top->ino == mp->m_sb.sb_rsumino)
+                               return TYP_RTSUMMARY;
+               }
+
+               if (iocur_top->ino == mp->m_sb.sb_uquotino ||
+                   iocur_top->ino == mp->m_sb.sb_gquotino ||
+                   iocur_top->ino == mp->m_sb.sb_pquotino)
                        return TYP_DQBLK;
-               else
-                       return TYP_DATA;
+
+               return TYP_DATA;
        default:
                return TYP_NONE;
        }
index 5cda1a4f35efb6247a01550d234eddfab6dcb045..3ef2dc8fe7f03107c62594c120c2183f8c076534 100644 (file)
@@ -44,6 +44,7 @@ const field_t rtsb_flds[] = {
        { "meta_uuid", FLDT_UUID, OI(OFF(meta_uuid)), C1, 0, TYP_NONE },
        { NULL }
 };
+#undef OFF
 
 const field_t  rtsb_hfld[] = {
        { "", FLDT_RTSB, OI(0), C1, 0, TYP_NONE },
@@ -98,3 +99,36 @@ rtsb_size(
 {
        return bitize(mp->m_sb.sb_blocksize);
 }
+
+static int
+rtwords_count(
+       void                    *obj,
+       int                     startoff)
+{
+       unsigned int            blksz = mp->m_sb.sb_blocksize;
+
+       if (xfs_has_rtgroups(mp))
+               blksz -= sizeof(struct xfs_rtbuf_blkinfo);
+
+       return blksz >> XFS_WORDLOG;
+}
+
+#define        OFF(f)  bitize(offsetof(struct xfs_rtbuf_blkinfo, rt_ ## f))
+const field_t  rgbitmap_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 rtword array is after the actual structure */
+       { "rtwords", FLDT_RTWORD, OI(bitize(sizeof(struct xfs_rtbuf_blkinfo))),
+         rtwords_count, FLD_ARRAY | FLD_COUNT, TYP_DATA },
+       { NULL }
+};
+#undef OFF
+
+const field_t  rgbitmap_hfld[] = {
+       { "", FLDT_RGBITMAP, OI(0), C1, 0, TYP_NONE },
+       { NULL }
+};
index 85960a3fb9f5c9deab6650a1dd12e16f7c10e2a3..06f554e186285177ca13686571250e70c4eab027 100644 (file)
@@ -9,6 +9,9 @@
 extern const struct field      rtsb_flds[];
 extern const struct field      rtsb_hfld[];
 
+extern const struct field      rgbitmap_flds[];
+extern const struct field      rgbitmap_hfld[];
+
 extern void    rtsb_init(void);
 extern int     rtsb_size(void *obj, int startoff, int idx);
 
index d875c0c636553b851cde8fe3feaececd1d3cdf35..65e7b24146f17072469f3bc2b398bc05a288a5b7 100644 (file)
--- a/db/type.c
+++ b/db/type.c
@@ -67,6 +67,7 @@ static const typ_t    __typtab[] = {
        { TYP_TEXT, "text", handle_text, NULL, NULL, TYP_F_NO_CRC_OFF },
        { TYP_FINOBT, "finobt", handle_struct, finobt_hfld, NULL,
                TYP_F_NO_CRC_OFF },
+       { TYP_RGBITMAP, NULL },
        { TYP_NONE, NULL }
 };
 
@@ -113,6 +114,8 @@ static const typ_t  __typtab_crc[] = {
        { TYP_TEXT, "text", handle_text, NULL, NULL, TYP_F_NO_CRC_OFF },
        { TYP_FINOBT, "finobt", handle_struct, finobt_crc_hfld,
                &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_NONE, NULL }
 };
 
@@ -159,6 +162,8 @@ static const typ_t  __typtab_spcrc[] = {
        { TYP_TEXT, "text", handle_text, NULL, NULL, TYP_F_NO_CRC_OFF },
        { TYP_FINOBT, "finobt", handle_struct, finobt_spcrc_hfld,
                &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_NONE, NULL }
 };
 
index d4efa4b0fab541a414d7fce733124e7492e397da..e2148c6351d1411c8aa4bb4498e9951de231c940 100644 (file)
--- a/db/type.h
+++ b/db/type.h
@@ -35,6 +35,7 @@ typedef enum typnm
        TYP_SYMLINK,
        TYP_TEXT,
        TYP_FINOBT,
+       TYP_RGBITMAP,
        TYP_NONE
 } typnm_t;