@@ -30,6 +30,10 @@
((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 */
@@ -1171,6 +1171,16 @@ .SH COMMANDS
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