@@ -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,
@@ -1099,6 +1099,28 @@ .SH COMMANDS
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