]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_db: support the realtime rmapbt
authorDarrick J. Wong <djwong@kernel.org>
Mon, 24 Feb 2025 18:21:58 +0000 (10:21 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 25 Feb 2025 17:16:00 +0000 (09:16 -0800)
Wire up various parts of xfs_db for realtime rmap support so that we can
dump the btree contents.

Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
db/btblock.c
db/btdump.c
db/btheight.c
libxfs/libxfs_api_defs.h
man/man8/xfs_db.8

index 5cad166278d98b034ab2dcbe4b67f322c00cf919..70f6c3f6aedde59f3886231a3844fec31f233bd7 100644 (file)
@@ -147,6 +147,9 @@ block_to_bt(
        case TYP_RMAPBT:
                magic = crc ? XFS_RMAP_CRC_MAGIC : 0;
                break;
+       case TYP_RTRMAPBT:
+               magic = crc ? XFS_RTRMAP_CRC_MAGIC : 0;
+               break;
        case TYP_REFCBT:
                magic = crc ? XFS_REFC_CRC_MAGIC : 0;
                break;
index 81642cde2b6d8fd0e85c6ceaa79ab050918cfb21..55301d25de10cd4c56ce95a9504dd75a5f40baf2 100644 (file)
@@ -441,6 +441,66 @@ err:
        return ret;
 }
 
+static bool
+is_btree_inode(void)
+{
+       struct xfs_dinode       *dip = iocur_top->data;
+
+       return dip->di_format == XFS_DINODE_FMT_META_BTREE;
+}
+
+static int
+dump_btree_inode(
+       bool                    dump_node_blocks)
+{
+       char                    *prefix;
+       struct xfs_dinode       *dip = iocur_top->data;
+       struct xfs_rtrmap_root  *rtrmap;
+       int                     level;
+       int                     numrecs;
+       int                     ret;
+
+       switch (be16_to_cpu(dip->di_metatype)) {
+       case XFS_METAFILE_RTRMAP:
+               prefix = "u3.rtrmapbt";
+               rtrmap = (struct xfs_rtrmap_root *)XFS_DFORK_DPTR(dip);
+               level = be16_to_cpu(rtrmap->bb_level);
+               numrecs = be16_to_cpu(rtrmap->bb_numrecs);
+               break;
+       default:
+               dbprintf("Unknown metadata inode btree type %u\n",
+                               be16_to_cpu(dip->di_metatype));
+               return 0;
+       }
+
+       if (numrecs == 0)
+               return 0;
+       if (level > 0) {
+               if (dump_node_blocks) {
+                       ret = eval("print %s.keys", prefix);
+                       if (ret)
+                               goto err;
+                       ret = eval("print %s.ptrs", prefix);
+                       if (ret)
+                               goto err;
+               }
+               ret = eval("addr %s.ptrs[1]", prefix);
+               if (ret)
+                       goto err;
+               ret = dump_btree_long(dump_node_blocks);
+       } else {
+               ret = eval("print %s.recs", prefix);
+       }
+       if (ret)
+               goto err;
+
+       ret = eval("pop");
+       return ret;
+err:
+       eval("pop");
+       return ret;
+}
+
 static int
 btdump_f(
        int             argc,
@@ -488,8 +548,11 @@ btdump_f(
                return dump_btree_short(iflag);
        case TYP_BMAPBTA:
        case TYP_BMAPBTD:
+       case TYP_RTRMAPBT:
                return dump_btree_long(iflag);
        case TYP_INODE:
+               if (is_btree_inode())
+                       return dump_btree_inode(iflag);
                return dump_inode(iflag, aflag);
        case TYP_ATTR:
                return dump_dabtree(iflag, crc ? &attr3_print : &attr_print);
index 0456af08b39edf5f432101b70381b5ef9bb29015..31dff1c924a2e00765c11bf61b8ed119c67e1243 100644 (file)
@@ -53,6 +53,11 @@ struct btmap {
                .maxlevels      = libxfs_rmapbt_maxlevels_ondisk,
                .maxrecs        = libxfs_rmapbt_maxrecs,
        },
+       {
+               .tag            = "rtrmapbt",
+               .maxlevels      = libxfs_rtrmapbt_maxlevels_ondisk,
+               .maxrecs        = libxfs_rtrmapbt_maxrecs,
+       },
 };
 
 static void
index fcbcaaa11f1025ec8cee5dcef55c09c0bf737e4c..cf88656946ab1b4eafc0aab50ade6ec3abfbfb26 100644 (file)
 #define xfs_rtfree_blocks              libxfs_rtfree_blocks
 #define xfs_update_rtsb                        libxfs_update_rtsb
 #define xfs_rtrmapbt_droot_maxrecs     libxfs_rtrmapbt_droot_maxrecs
+#define xfs_rtrmapbt_maxlevels_ondisk  libxfs_rtrmapbt_maxlevels_ondisk
 #define xfs_rtrmapbt_maxrecs           libxfs_rtrmapbt_maxrecs
 
 #define xfs_sb_from_disk               libxfs_sb_from_disk
index ddbabe36b5fc4149121c58d9f10fc01cca4f13df..83a8734d3c0b476cf6dbdbd7a53772c46c17bacd 100644 (file)
@@ -535,8 +535,9 @@ The supported btree types are:
 .IR finobt ,
 .IR bmapbt ,
 .IR refcountbt ,
+.IR rmapbt ,
 and
-.IR rmapbt .
+.IR rtrmapbt .
 The magic value
 .I all
 can be used to walk through all btree types.