@@ -50,6 +50,30 @@ sb_init(void)
add_command(&version_cmd);
}
+/*
+ * Counts superblock fields that only exist when the metadata directory feature
+ * is enabled.
+ */
+static int
+metadirino_count(
+ void *obj,
+ int startoff)
+{
+ return xfs_has_metadir(mp) ? 1 : 0;
+}
+
+/*
+ * Counts superblock fields that only existed before the metadata directory
+ * feature came along.
+ */
+static int
+rootino_count(
+ void *obj,
+ int startoff)
+{
+ return xfs_has_metadir(mp) ? 0 : 1;
+}
+
#define OFF(f) bitize(offsetof(struct xfs_dsb, sb_ ## f))
#define SZC(f) szcount(struct xfs_dsb, sb_ ## f)
const field_t sb_flds[] = {
@@ -61,8 +85,12 @@ const field_t sb_flds[] = {
{ "uuid", FLDT_UUID, OI(OFF(uuid)), C1, 0, TYP_NONE },
{ "logstart", FLDT_DFSBNO, OI(OFF(logstart)), C1, 0, TYP_LOG },
{ "rootino", FLDT_INO, OI(OFF(rootino)), C1, 0, TYP_INODE },
- { "rbmino", FLDT_INO, OI(OFF(rbmino)), C1, 0, TYP_INODE },
- { "rsumino", FLDT_INO, OI(OFF(rsumino)), C1, 0, TYP_INODE },
+ { "metadirino", FLDT_INO, OI(OFF(rbmino)), metadirino_count,
+ FLD_COUNT, TYP_INODE },
+ { "rbmino", FLDT_INO, OI(OFF(rbmino)), rootino_count, FLD_COUNT,
+ TYP_INODE },
+ { "rsumino", FLDT_INO, OI(OFF(rsumino)), rootino_count, FLD_COUNT,
+ TYP_INODE },
{ "rextsize", FLDT_AGBLOCK, OI(OFF(rextsize)), C1, 0, TYP_NONE },
{ "agblocks", FLDT_AGBLOCK, OI(OFF(agblocks)), C1, 0, TYP_NONE },
{ "agcount", FLDT_AGNUMBER, OI(OFF(agcount)), C1, 0, TYP_NONE },
@@ -85,8 +113,10 @@ const field_t sb_flds[] = {
{ "ifree", FLDT_UINT64D, OI(OFF(ifree)), C1, 0, TYP_NONE },
{ "fdblocks", FLDT_UINT64D, OI(OFF(fdblocks)), C1, 0, TYP_NONE },
{ "frextents", FLDT_UINT64D, OI(OFF(frextents)), C1, 0, TYP_NONE },
- { "uquotino", FLDT_INO, OI(OFF(uquotino)), C1, 0, TYP_INODE },
- { "gquotino", FLDT_INO, OI(OFF(gquotino)), C1, 0, TYP_INODE },
+ { "uquotino", FLDT_INO, OI(OFF(uquotino)), rootino_count, FLD_COUNT,
+ TYP_INODE },
+ { "gquotino", FLDT_INO, OI(OFF(gquotino)), rootino_count, FLD_COUNT,
+ TYP_INODE },
{ "qflags", FLDT_UINT16X, OI(OFF(qflags)), C1, 0, TYP_NONE },
{ "flags", FLDT_UINT8X, OI(OFF(flags)), C1, 0, TYP_NONE },
{ "shared_vn", FLDT_UINT8D, OI(OFF(shared_vn)), C1, 0, TYP_NONE },
@@ -110,7 +140,8 @@ const field_t sb_flds[] = {
C1, 0, TYP_NONE },
{ "crc", FLDT_CRC, OI(OFF(crc)), C1, 0, TYP_NONE },
{ "spino_align", FLDT_EXTLEN, OI(OFF(spino_align)), C1, 0, TYP_NONE },
- { "pquotino", FLDT_INO, OI(OFF(pquotino)), C1, 0, TYP_INODE },
+ { "pquotino", FLDT_INO, OI(OFF(pquotino)), rootino_count, FLD_COUNT,
+ TYP_INODE },
{ "lsn", FLDT_UINT64X, OI(OFF(lsn)), C1, 0, TYP_NONE },
{ "meta_uuid", FLDT_UUID, OI(OFF(meta_uuid)), C1, 0, TYP_NONE },
{ NULL }