@@ -196,6 +196,13 @@ dblock_help(void)
));
}
+static inline bool
+is_rtfile(
+ struct xfs_dinode *dip)
+{
+ return dip->di_flags & cpu_to_be16(XFS_DIFLAG_REALTIME);
+}
+
static int
dblock_f(
int argc,
@@ -235,8 +242,14 @@ dblock_f(
ASSERT(typtab[type].typnm == type);
if (nex > 1)
make_bbmap(&bbmap, nex, bmp);
- set_cur(&typtab[type], (int64_t)XFS_FSB_TO_DADDR(mp, dfsbno),
- nb * blkbb, DB_RING_ADD, nex > 1 ? &bbmap : NULL);
+ if (is_rtfile(iocur_top->data))
+ set_rt_cur(&typtab[type], xfs_rtb_to_daddr(mp, dfsbno),
+ nb * blkbb, DB_RING_ADD,
+ nex > 1 ? &bbmap : NULL);
+ else
+ set_cur(&typtab[type], (int64_t)XFS_FSB_TO_DADDR(mp, dfsbno),
+ nb * blkbb, DB_RING_ADD,
+ nex > 1 ? &bbmap : NULL);
free(bmp);
return 0;
}
@@ -3,8 +3,28 @@
* Copyright (c) 2000-2001,2005 Silicon Graphics, Inc.
* All Rights Reserved.
*/
+#ifndef __XFS_DB_BLOCK_H
+#define __XFS_DB_BLOCK_H
struct field;
extern void block_init(void);
extern void print_block(const struct field *fields, int argc, char **argv);
+
+static inline xfs_daddr_t
+xfs_rtb_to_daddr(
+ struct xfs_mount *mp,
+ xfs_rtblock_t rtb)
+{
+ return rtb << mp->m_blkbb_log;
+}
+
+static inline xfs_rtblock_t
+xfs_daddr_to_rtb(
+ struct xfs_mount *mp,
+ xfs_daddr_t daddr)
+{
+ return daddr >> mp->m_blkbb_log;
+}
+
+#endif /* __XFS_DB_BLOCK_H */
@@ -15,6 +15,7 @@
#include "bmap.h"
#include "output.h"
#include "init.h"
+#include "block.h"
void
fa_agblock(
@@ -323,7 +324,9 @@ fa_drtbno(
dbprintf(_("null block number, cannot set new addr\n"));
return;
}
- /* need set_cur to understand rt subvolume */
+
+ set_rt_cur(&typtab[next], xfs_rtb_to_daddr(mp, bno), blkbb,
+ DB_RING_ADD, NULL);
}
/*ARGSUSED*/