]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
xfs_db: access arbitrary realtime blocks and extents
authorDarrick J. Wong <djwong@kernel.org>
Tue, 29 Oct 2024 00:03:32 +0000 (17:03 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Thu, 31 Oct 2024 22:45:05 +0000 (15:45 -0700)
Add two commands to xfs_db so that we can point ourselves at any
arbitrary realtime block or extent.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
db/block.c
man/man8/xfs_db.8

index 87118a4751ef940a422070da050085b3b1809ff2..79ae0ea5802a83e8aee974e142232cb34360563a 100644 (file)
@@ -25,6 +25,10 @@ static int   dblock_f(int argc, char **argv);
 static void     dblock_help(void);
 static int     fsblock_f(int argc, char **argv);
 static void     fsblock_help(void);
+static int     rtblock_f(int argc, char **argv);
+static void    rtblock_help(void);
+static int     rtextent_f(int argc, char **argv);
+static void    rtextent_help(void);
 static void    print_rawdata(void *data, int len);
 
 static const cmdinfo_t ablock_cmd =
@@ -39,6 +43,12 @@ static const cmdinfo_t       dblock_cmd =
 static const cmdinfo_t fsblock_cmd =
        { "fsblock", "fsb", fsblock_f, 0, 1, 1, N_("[fsb]"),
          N_("set address to fsblock value"), fsblock_help };
+static const cmdinfo_t rtblock_cmd =
+       { "rtblock", "rtbno", rtblock_f, 0, 1, 1, N_("[rtbno]"),
+         N_("set address to rtblock value"), rtblock_help };
+static const cmdinfo_t rtextent_cmd =
+       { "rtextent", "rtx", rtextent_f, 0, 1, 1, N_("[rtxno]"),
+         N_("set address to rtextent value"), rtextent_help };
 
 static void
 ablock_help(void)
@@ -104,6 +114,8 @@ block_init(void)
        add_command(&daddr_cmd);
        add_command(&dblock_cmd);
        add_command(&fsblock_cmd);
+       add_command(&rtblock_cmd);
+       add_command(&rtextent_cmd);
 }
 
 static void
@@ -302,6 +314,103 @@ fsblock_f(
        return 0;
 }
 
+static void
+rtblock_help(void)
+{
+       dbprintf(_(
+"\n Example:\n"
+"\n"
+" 'rtblock 1023' - sets the file position to the 1023rd block on the realtime\n"
+" volume. The filesystem block size is specified in the superblock and set\n"
+" during mkfs time.\n\n"
+));
+}
+
+static int
+rtblock_f(
+       int             argc,
+       char            **argv)
+{
+       xfs_rtblock_t   rtbno;
+       char            *p;
+
+       if (argc == 1) {
+               if (!iocur_is_rtdev(iocur_top)) {
+                       dbprintf(_("cursor does not point to rt device\n"));
+                       return 0;
+               }
+               dbprintf(_("current rtblock is %lld\n"),
+                       xfs_daddr_to_rtb(mp, iocur_top->off >> BBSHIFT));
+               return 0;
+       }
+       rtbno = strtoull(argv[1], &p, 0);
+       if (*p != '\0') {
+               dbprintf(_("bad rtblock %s\n"), argv[1]);
+               return 0;
+       }
+       if (rtbno >= mp->m_sb.sb_rblocks) {
+               dbprintf(_("bad rtblock %s\n"), argv[1]);
+               return 0;
+       }
+       ASSERT(typtab[TYP_DATA].typnm == TYP_DATA);
+       set_rt_cur(&typtab[TYP_DATA], xfs_rtb_to_daddr(mp, rtbno), blkbb,
+                       DB_RING_ADD, NULL);
+       return 0;
+}
+
+static void
+rtextent_help(void)
+{
+       dbprintf(_(
+"\n Example:\n"
+"\n"
+" 'rtextent 10' - sets the file position to the 10th extent on the realtime\n"
+" volume. The realtime extent size is specified in the superblock and set\n"
+" during mkfs or growfs time.\n\n"
+));
+}
+
+/*
+ * Move the cursor to a specific location on the realtime block device given
+ * a linear address in units of realtime extents.
+ */
+static int
+rtextent_f(
+       int             argc,
+       char            **argv)
+{
+       xfs_rtblock_t   rtbno;
+       xfs_rtxnum_t    rtx;
+       char            *p;
+
+       if (argc == 1) {
+               if (!iocur_is_rtdev(iocur_top)) {
+                       dbprintf(_("cursor does not point to rt device\n"));
+                       return 0;
+               }
+
+               rtbno = xfs_daddr_to_rtb(mp, iocur_top->off >> BBSHIFT);
+               dbprintf(_("current rtextent is %lld\n"),
+                               xfs_rtb_to_rtx(mp, rtbno));
+               return 0;
+       }
+       rtx = strtoull(argv[1], &p, 0);
+       if (*p != '\0') {
+               dbprintf(_("bad rtextent %s\n"), argv[1]);
+               return 0;
+       }
+       if (rtx >= mp->m_sb.sb_rextents) {
+               dbprintf(_("bad rtextent %s\n"), argv[1]);
+               return 0;
+       }
+
+       rtbno = xfs_rtx_to_rtb(mp, rtx);
+       ASSERT(typtab[TYP_DATA].typnm == TYP_DATA);
+       set_rt_cur(&typtab[TYP_DATA], xfs_rtb_to_daddr(mp, rtbno),
+                       mp->m_sb.sb_rextsize * blkbb, DB_RING_ADD, NULL);
+       return 0;
+}
+
 void
 print_block(
        const field_t   *fields,
index f50ac949be018947d37c1cf6bfde7f7a3056794b..48afcb6e81787b44eb31a7da132a4bfbf7c270f3 100644 (file)
@@ -1099,6 +1099,28 @@ command.
 Exit
 .BR xfs_db .
 .TP
+.BI "rtblock [" rtbno ]
+Set current address to the location on the realtime device given by
+.IR rtbno .
+This value must be a realtime block number.
+If no value for
+.I rtbno
+is given the current address is printed, expressed as an rtbno.
+The type is set to
+.B data
+(uninterpreted).
+.TP
+.BI "rtextent [" rtxno ]
+Set current address to the location on the realtime device given by
+.IR rtextent .
+This value must be a linear address in units of realtime extents.
+If no value for
+.I rtextent
+is given the current address is printed, expressed as an rtextent.
+The type is set to
+.B data
+(uninterpreted).
+.TP
 .BI "ring [" index ]
 Show position ring (if no
 .I index