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))
+#define rgblock_to_bytes(x) \
+ ((uint64_t)(x) << mp->m_sb.sb_blocklog)
+#define rgnumber_to_bytes(x) \
+ rgblock_to_bytes((uint64_t)(x) * mp->m_rgblocks)
typedef enum {
CT_NONE = -1,
CT_RSUMBLOCK, /* block within rt summary */
CT_RSUMLOG, /* log level for rtsummary computations */
CT_RSUMINFO, /* info word within rt summary */
+ CT_RGBLOCK, /* xfs_rgblock_t */
+ CT_RGNUMBER, /* xfs_rgno_t */
NCTS
} ctype_t;
xfs_fileoff_t rbmblock;
unsigned int rbmword;
xfs_fileoff_t rsumblock;
+ xfs_rgnumber_t rgnumber;
+ xfs_rgblock_t rgblock;
} cval_t;
static uint64_t bytevalue(ctype_t ctype, cval_t *val);
static const char *bboff_names[] = { "bboff", "daddroff", NULL };
static const char *blkoff_names[] = { "blkoff", "fsboff", "agboff",
NULL };
-static const char *rtblkoff_names[] = { "blkoff", "rtboff",
+static const char *rtblkoff_names[] = { "blkoff", "rtboff", "rgboff",
NULL };
static const char *byte_names[] = { "byte", "fsbyte", NULL };
static const char *daddr_names[] = { "daddr", "bb", NULL };
static const char *rsumblock_names[] = { "rsumblock", "rsmb", NULL };
static const char *rsumlog_names[] = { "rsumlog", "rsml", NULL };
static const char *rsumword_names[] = { "rsuminfo", "rsmi", NULL };
+static const char *rgblock_names[] = { "rgblock", "rgbno", NULL };
+static const char *rgnumber_names[] = { "rgnumber", "rgno", NULL };
static int rsuminfo;
static int rsumlog;
.allowed = M(RSUMBLOCK),
.names = rsumword_names,
},
+ [CT_RGBLOCK] = {
+ .allowed = M(RGNUMBER)|M(BBOFF)|M(BLKOFF)|M(RSUMLOG),
+ .names = rgblock_names,
+ },
+ [CT_RGNUMBER] = {
+ .allowed = M(RGBLOCK)|M(BBOFF)|M(BLKOFF)|M(RSUMLOG),
+ .names = rgnumber_names,
+ },
};
static const cmdinfo_t convert_cmd =
* value.
*/
return 0;
+ case CT_RGBLOCK:
+ return rgblock_to_bytes(val->rgblock);
+ case CT_RGNUMBER:
+ return rgnumber_to_bytes(val->rgnumber);
case CT_NONE:
case NCTS:
break;
case CT_RSUMBLOCK:
case CT_RSUMLOG:
case CT_RSUMINFO:
+ case CT_RGBLOCK:
+ case CT_RGNUMBER:
/* shouldn't get here */
ASSERT(0);
break;
return xfs_rtsumoffs_to_infoword(mp, rsumoff);
}
+static inline xfs_rgnumber_t
+xfs_daddr_to_rgno(
+ struct xfs_mount *mp,
+ xfs_daddr_t daddr)
+{
+ xfs_rtblock_t rtb = daddr >> mp->m_blkbb_log;
+
+ return xfs_rtb_to_rgno(mp, rtb);
+}
+
+static inline xfs_rgblock_t
+xfs_daddr_to_rgbno(
+ struct xfs_mount *mp,
+ xfs_daddr_t daddr)
+{
+ xfs_rtblock_t rtb = daddr >> mp->m_blkbb_log;
+
+ return xfs_rtb_to_rgbno(mp, rtb);
+}
+
static int
rtconvert_f(int argc, char **argv)
{
case CT_RSUMINFO:
v = rt_daddr_to_rsuminfo(mp, v);
break;
+ case CT_RGBLOCK:
+ v = xfs_daddr_to_rgbno(mp, v >> BBSHIFT);
+ break;
+ case CT_RGNUMBER:
+ v = xfs_daddr_to_rgno(mp, v >> BBSHIFT);
+ break;
case CT_AGBLOCK:
case CT_AGINO:
case CT_AGNUMBER:
case CT_RSUMINFO:
rsuminfo = (unsigned int)v;
break;
+ case CT_RGBLOCK:
+ val->rgblock = (xfs_rgblock_t)v;
+ break;
+ case CT_RGNUMBER:
+ val->rgnumber = (xfs_rgnumber_t)v;
+ break;
case CT_NONE:
case NCTS:
/* NOTREACHED */