xfs
[Top] [All Lists]

[PATCH 19/29] xfs_db: make fsmap query the realtime reverse mapping tree

To: david@xxxxxxxxxxxxx, darrick.wong@xxxxxxxxxx
Subject: [PATCH 19/29] xfs_db: make fsmap query the realtime reverse mapping tree
From: "Darrick J. Wong" <darrick.wong@xxxxxxxxxx>
Date: Thu, 25 Aug 2016 17:00:36 -0700
Cc: linux-xfs@xxxxxxxxxxxxxxx, xfs@xxxxxxxxxxx
Delivered-to: xfs@xxxxxxxxxxx
In-reply-to: <147216950911.7022.438115723996286926.stgit@xxxxxxxxxxxxxxxx>
References: <147216950911.7022.438115723996286926.stgit@xxxxxxxxxxxxxxxx>
User-agent: StGit/0.17.1-dirty
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@xxxxxxxxxx>
---
 db/fsmap.c               |   70 +++++++++++++++++++++++++++++++++++++++++++---
 libxfs/libxfs_api_defs.h |    1 +
 2 files changed, 67 insertions(+), 4 deletions(-)


diff --git a/db/fsmap.c b/db/fsmap.c
index a25461e..bb08421 100644
--- a/db/fsmap.c
+++ b/db/fsmap.c
@@ -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;
 }
diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h
index c66e31b..a6ea865 100644
--- a/libxfs/libxfs_api_defs.h
+++ b/libxfs/libxfs_api_defs.h
@@ -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__ */

<Prev in Thread] Current Thread [Next in Thread>