]> git.apps.os.sepia.ceph.com Git - xfsprogs-dev.git/commitdiff
xfs_db: convert rtbitmap geometry
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)
Teach the rtconvert command to be able to convert realtime blocks and
extents to locations within the rt bitmap.

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

index 4c2ff1c5804c476bf08d1b3549c49c3b43dc2145..7c10690f574f7aa84f272e1a744e61c061e03fe7 100644 (file)
        ((uint64_t)(x) << mp->m_sb.sb_blocklog)
 #define rtx_to_rtblock(x)      \
        ((uint64_t)(x) * mp->m_sb.sb_rextsize)
+#define rbmblock_to_bytes(x)   \
+       rtblock_to_bytes(rtx_to_rtblock(xfs_rbmblock_to_rtx(mp, (uint64_t)x)))
+#define rbmword_to_bytes(x)    \
+       rtblock_to_bytes(rtx_to_rtblock((uint64_t)(x) << XFS_NBWORDLOG))
 
 typedef enum {
        CT_NONE = -1,
@@ -47,6 +51,8 @@ typedef enum {
        CT_INOOFF,              /* byte offset in inode */
        CT_RTBLOCK,             /* realtime block */
        CT_RTX,                 /* realtime extent */
+       CT_RBMBLOCK,            /* block within rt bitmap */
+       CT_RBMWORD,             /* word within rt bitmap */
        NCTS
 } ctype_t;
 
@@ -69,6 +75,8 @@ typedef union {
        int             inooff;
        xfs_rtblock_t   rtblock;
        xfs_rtblock_t   rtx;
+       xfs_fileoff_t   rbmblock;
+       unsigned int    rbmword;
 } cval_t;
 
 static uint64_t                bytevalue(ctype_t ctype, cval_t *val);
@@ -95,6 +103,8 @@ static const char    *inooff_names[] = { "inooff", "inodeoff", NULL };
 
 static const char      *rtblock_names[] = { "rtblock", "rtb", "rtbno", NULL };
 static const char      *rtx_names[] = { "rtx", "rtextent", NULL };
+static const char      *rbmblock_names[] = { "rbmblock", "rbmb", NULL };
+static const char      *rbmword_names[] = { "rbmword", "rbmw", NULL };
 
 static const ctydesc_t ctydescs[NCTS] = {
        [CT_AGBLOCK] = {
@@ -196,6 +206,14 @@ static const ctydesc_t     ctydescs_rt[NCTS] = {
                           M(BLKOFF),
                .names   = rtx_names,
        },
+       [CT_RBMBLOCK] = {
+               .allowed = M(RBMWORD),
+               .names   = rbmblock_names,
+       },
+       [CT_RBMWORD] = {
+               .allowed = M(RBMBLOCK),
+               .names   = rbmword_names,
+       },
 };
 
 static const cmdinfo_t convert_cmd =
@@ -236,6 +254,10 @@ bytevalue(ctype_t ctype, cval_t *val)
                return rtblock_to_bytes(val->rtblock);
        case CT_RTX:
                return rtblock_to_bytes(rtx_to_rtblock(val->rtx));
+       case CT_RBMBLOCK:
+               return rbmblock_to_bytes(val->rbmblock);
+       case CT_RBMWORD:
+               return rbmword_to_bytes(val->rbmword);
        case CT_NONE:
        case NCTS:
                break;
@@ -337,6 +359,8 @@ convert_f(int argc, char **argv)
                break;
        case CT_RTBLOCK:
        case CT_RTX:
+       case CT_RBMBLOCK:
+       case CT_RBMWORD:
                /* shouldn't get here */
                ASSERT(0);
                break;
@@ -418,6 +442,16 @@ rtconvert_f(int argc, char **argv)
        case CT_RTX:
                v = xfs_daddr_to_rtb(mp, v >> BBSHIFT) / mp->m_sb.sb_rextsize;
                break;
+       case CT_RBMBLOCK:
+               v = xfs_rtx_to_rbmblock(mp,
+                               xfs_rtb_to_rtx(mp,
+                                       xfs_daddr_to_rtb(mp, v >> BBSHIFT)));
+               break;
+       case CT_RBMWORD:
+               v = xfs_rtx_to_rbmword(mp,
+                               xfs_rtb_to_rtx(mp,
+                                       xfs_daddr_to_rtb(mp, v >> BBSHIFT)));
+               break;
        case CT_AGBLOCK:
        case CT_AGINO:
        case CT_AGNUMBER:
@@ -495,6 +529,12 @@ getvalue(char *s, ctype_t ctype, cval_t *val)
        case CT_RTX:
                val->rtx = (xfs_rtblock_t)v;
                break;
+       case CT_RBMBLOCK:
+               val->rbmblock = (xfs_fileoff_t)v;
+               break;
+       case CT_RBMWORD:
+               val->rbmword = (unsigned int)v;
+               break;
        case CT_NONE:
        case NCTS:
                /* NOTREACHED */
index 0bf434299a3fb4084cb71a0ca5607f5aeecd7096..12fc4f3b51016b316789398cee33f9a79823b3f6 100644 (file)
@@ -1173,6 +1173,16 @@ command)
 or
 .B rtextent
 (realtime extent)
+.HP
+.B rbmblock
+or
+.B rbmb
+(realtime bitmap block)
+.HP
+.B rbmword
+or
+.B rbmw
+(32-bit word within a realtime bitmap block)
 .PD
 .RE
 .IP