[PATCH 05/50] libfrog: scrub the realtime group superblock

Darrick J. Wong
2024-12-07T00:06:13Z

From: Darrick J. Wong <djwong@kernel.org>

Enable scrubbing of realtime group superblocks in xfs_scrub, and
update the scrub ioctl documentation.

Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
---
libfrog/scrub.c | 5 +++++
libfrog/scrub.h | 1 +
man/man2/ioctl_xfs_scrub_metadata.2 | 9 +++++++++
scrub/repair.c | 1 +
scrub/scrub.c | 6 ++++++
5 files changed, 22 insertions(+)

diff --git a/libfrog/scrub.c b/libfrog/scrub.c
index b2d58c7a966b0d..e7fb8b890bc133 100644
--- a/libfrog/scrub.c
+++ b/libfrog/scrub.c
@@ -159,6 +159,11 @@ const struct xfrog_scrub_descr xfrog_scrubbers[XFS_SCRUB_TYPE_NR] = {
.descr = "metadata directory paths",
.group = XFROG_SCRUB_GROUP_METAPATH,
},
+ [XFS_SCRUB_TYPE_RGSUPER] = {
+ .name = "rgsuper",
+ .descr = "realtime group superblock",
+ .group = XFROG_SCRUB_GROUP_RTGROUP,
+ },
};

const struct xfrog_scrub_descr xfrog_metapaths[XFS_SCRUB_METAPATH_NR] = {
diff --git a/libfrog/scrub.h b/libfrog/scrub.h
index a35d3e9c293fe5..83455c390e170a 100644
--- a/libfrog/scrub.h
+++ b/libfrog/scrub.h
@@ -16,6 +16,7 @@ enum xfrog_scrub_group {
XFROG_SCRUB_GROUP_ISCAN, /* metadata requiring full inode scan */
XFROG_SCRUB_GROUP_SUMMARY, /* summary metadata */
XFROG_SCRUB_GROUP_METAPATH, /* metadata directory path */
+ XFROG_SCRUB_GROUP_RTGROUP, /* per-rtgroup metadata */
};

/* Catalog of scrub types and names, indexed by XFS_SCRUB_TYPE_* */
diff --git a/man/man2/ioctl_xfs_scrub_metadata.2 b/man/man2/ioctl_xfs_scrub_metadata.2
index 1e7e327b37d226..545e3fcbac320e 100644
--- a/man/man2/ioctl_xfs_scrub_metadata.2
+++ b/man/man2/ioctl_xfs_scrub_metadata.2
@@ -88,6 +88,15 @@ .SH DESCRIPTION
.BR sm_ino " and " sm_gen
must be zero.

+.PP
+.TP
+.B XFS_SCRUB_TYPE_RGSUPER
+Examine a given realtime allocation group's superblock.
+The realtime allocation group number must be given in
+.IR sm_agno "."
+.IR sm_ino " and " sm_gen
+must be zero.
+
.TP
.B XFS_SCRUB_TYPE_INODE
Examine a given inode record for obviously incorrect values and
diff --git a/scrub/repair.c b/scrub/repair.c
index e594e704f51503..c8cdb98de5457b 100644
--- a/scrub/repair.c
+++ b/scrub/repair.c
@@ -546,6 +546,7 @@ repair_item_difficulty(
case XFS_SCRUB_TYPE_REFCNTBT:
case XFS_SCRUB_TYPE_RTBITMAP:
case XFS_SCRUB_TYPE_RTSUM:
+ case XFS_SCRUB_TYPE_RGSUPER:
ret |= REPAIR_DIFFICULTY_PRIMARY;
break;
}
diff --git a/scrub/scrub.c b/scrub/scrub.c
index bcd63eea1030a6..a2fd8d77d82be0 100644
--- a/scrub/scrub.c
+++ b/scrub/scrub.c
@@ -66,6 +66,9 @@ format_metapath_descr(
(unsigned long long)vhead->svh_ino);

sc = &xfrog_metapaths[vhead->svh_ino];
+ if (sc->group == XFROG_SCRUB_GROUP_RTGROUP)
+ return snprintf(buf, buflen, _("rtgroup %u %s"),
+ vhead->svh_agno, _(sc->descr));
return snprintf(buf, buflen, "%s", _(sc->descr));
}

@@ -107,6 +110,9 @@ format_scrubv_descr(
return snprintf(buf, buflen, _("%s"), _(sc->descr));
case XFROG_SCRUB_GROUP_METAPATH:
return format_metapath_descr(buf, buflen, vhead);
+ case XFROG_SCRUB_GROUP_RTGROUP:
+ return snprintf(buf, buflen, _("rtgroup %u %s"),
+ vhead->svh_agno, _(sc->descr));
}
return -1;
}