xfs_db: support the realtime rmapbt
authorDarrick J. Wong <djwong@kernel.org>
Thu, 15 Aug 2024 18:57:37 +0000 (11:57 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Wed, 9 Oct 2024 23:29:18 +0000 (16:29 -0700)
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>
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..9c528e5a11a6954ff75c6095b28051356b0d311e 100644 (file)
@@ -441,6 +441,67 @@ err:
        return ret;
 }
 
+static bool
+is_btree_inode(void)
+{
+       struct xfs_dinode       *dip;
+
+       dip = iocur_top->data;
+       return dip->di_format == XFS_DINODE_FMT_RMAP;
+}
+
+static int
+dump_btree_inode(
+       bool                    dump_node_blocks)
+{
+       char                    *prefix;
+       struct xfs_dinode       *dip;
+       struct xfs_rtrmap_root  *rtrmap;
+       int                     level;
+       int                     numrecs;
+       int                     ret;
+
+       dip = iocur_top->data;
+       switch (dip->di_format) {
+       case XFS_DINODE_FMT_RMAP:
+               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 type %u\n", dip->di_format);
+               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 +549,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 6643489c82c4c9e264e94f6ccfbe8ab7a4ae61a0..25ce3400334270f5f16bffd927bfdc99fa706c11 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 9ae830b6d1172d162212aeabfe95c6ef634389de..cddf7d34ab0de2d6e0a18e8354bec20b58ddae79 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 b9686ef42bbdf78f8ae851f3e77f15db34b25544..2bb248b6f633557a7cb0b8710f395928452c7c09 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.