@@ -36,8 +36,8 @@ fsmap_fn(
{
struct fsmap_info *info = priv;
- dbprintf(_("%llu: %u/%u len %u owner %lld offset %llu bmbt %d attrfork %d extflag %d\n"),
- info->nr, info->agno, rec->rm_startblock,
+ dbprintf(_("%llu: %d/%llu len %llu owner %lld offset %llu bmbt %d attrfork %d extflag %d\n"),
+ info->nr, (signed)info->agno, rec->rm_startblock,
rec->rm_blockcount, rec->rm_owner, rec->rm_offset,
!!(rec->rm_flags & XFS_RMAP_BMBT_BLOCK),
!!(rec->rm_flags & XFS_RMAP_ATTR_FORK),
@@ -113,6 +113,61 @@ fsmap(
}
}
+static void
+fsmap_rt(
+ xfs_fsblock_t start_fsb,
+ xfs_fsblock_t end_fsb)
+{
+ struct fsmap_info info;
+ xfs_daddr_t eofs;
+ struct xfs_rmap_irec low;
+ struct xfs_rmap_irec high;
+ struct xfs_btree_cur *bt_cur;
+ struct xfs_inode *ip;
+ int error;
+
+ if (mp->m_sb.sb_rblocks == 0)
+ return;
+
+ eofs = XFS_FSB_TO_BB(mp, mp->m_sb.sb_rblocks);
+ if (XFS_FSB_TO_DADDR(mp, end_fsb) >= eofs)
+ end_fsb = XFS_DADDR_TO_FSB(mp, eofs - 1);
+
+ low.rm_startblock = start_fsb;
+ low.rm_owner = 0;
+ low.rm_offset = 0;
+ low.rm_flags = 0;
+ high.rm_startblock = end_fsb;
+ high.rm_owner = ULLONG_MAX;
+ high.rm_offset = ULLONG_MAX;
+ high.rm_flags = XFS_RMAP_ATTR_FORK | XFS_RMAP_BMBT_BLOCK |
+ XFS_RMAP_UNWRITTEN;
+
+ info.nr = 0;
+
+ error = -libxfs_iget(mp, NULL, mp->m_sb.sb_rrmapino, 0, &ip, 0);
+ if (error) {
+ dbprintf(_("%d - couldn't iget rtrmap inode.\n"),
+ error);
+ return;
+ }
+
+ bt_cur = libxfs_rtrmapbt_init_cursor(mp, NULL, ip);
+ if (!bt_cur)
+ goto out_ino;
+
+ info.agno = NULLAGNUMBER;
+ error = -libxfs_rmap_query_range(bt_cur, &low, &high,
+ fsmap_fn, &info);
+ if (error)
+ dbprintf(_("Error %d while querying fsmap btree.\n"),
+ error);
+
+ libxfs_btree_del_cursor(bt_cur, XFS_BTREE_NOERROR);
+out_ino:
+ IRELE(ip);
+}
+
int
fsmap_f(
int argc,
@@ -122,14 +177,18 @@ fsmap_f(
int c;
xfs_fsblock_t start_fsb = 0;
xfs_fsblock_t end_fsb = NULLFSBLOCK;
+ bool is_rt = false;
if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) {
dbprintf(_("Filesystem does not support reverse mapping btree.\n"));
return 0;
}
- while ((c = getopt(argc, argv, "")) != EOF) {
+ while ((c = getopt(argc, argv, "r")) != EOF) {
switch (c) {
+ case 'r':
+ is_rt = true;
+ break;
default:
dbprintf(_("Bad option for fsmap command.\n"));
return 0;
@@ -152,7 +211,10 @@ fsmap_f(
}
}
- fsmap(start_fsb, end_fsb);
+ if (is_rt)
+ fsmap_rt(start_fsb, end_fsb);
+ else
+ fsmap(start_fsb, end_fsb);
return 0;
}
@@ -143,5 +143,6 @@
#define xfs_rmap_lookup_le_range libxfs_rmap_lookup_le_range
#define xfs_refc_block libxfs_refc_block
#define xfs_rtrmapbt_maxrecs libxfs_rtrmapbt_maxrecs
+#define xfs_rtrmapbt_init_cursor libxfs_rtrmapbt_init_cursor
#endif /* __LIBXFS_API_DEFS_H__ */
Extend the 'fsmap' debugger command to support querying the realtime rmap btree via a new -r argument. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> --- db/fsmap.c | 70 +++++++++++++++++++++++++++++++++++++++++++--- libxfs/libxfs_api_defs.h | 1 + 2 files changed, 67 insertions(+), 4 deletions(-)