]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
xfs_db: convert rtbitmap geometry
authorDarrick J. Wong <djwong@kernel.org>
Tue, 20 Sep 2022 23:01:06 +0000 (16:01 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Wed, 22 Nov 2023 23:03:33 +0000 (15:03 -0800)
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>
db/convert.c
man/man8/xfs_db.8

index 811bac00f7196f4d31bc2877ca6660c33915a3ed..35e71f8a4421d6a116cc30868f53ccac044c6dd1 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,
@@ -46,6 +50,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;
 
@@ -68,6 +74,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);
@@ -94,6 +102,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] = {
@@ -167,6 +177,14 @@ static const ctydesc_t     ctydescs_rt[NCTS] = {
                .allowed = M(BBOFF)|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 =
@@ -207,6 +225,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;
@@ -308,6 +330,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;
@@ -397,6 +421,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:
@@ -474,6 +508,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 dc0bbfc9ac9b464451341c29b7b2004fa502d473..a1ea21162b5eaff709f872f422d32c02837aba7f 100644 (file)
@@ -1098,6 +1098,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