[PATCH 31/43] xfs_io: support scrubbing rtgroup metadata paths

Darrick J. Wong
2024-10-11T01:32:39Z

Support scrubbing the metadata directory path of an rtgroup metadata
file.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
---
io/scrub.c | 41 +++++++++++++++++++++++++++++++++++------
man/man8/xfs_io.8 | 3 ++-
2 files changed, 37 insertions(+), 7 deletions(-)

diff --git a/io/scrub.c b/io/scrub.c
index 99c24d9550243c..a137f402b94d48 100644
--- a/io/scrub.c
+++ b/io/scrub.c
@@ -136,21 +136,23 @@ parse_metapath(
int argc,
char **argv,
int optind,
- __u64 *ino)
+ __u64 *ino,
+ __u32 *group)
{
char *p;
unsigned long long control;
+ unsigned long control2 = 0;
int i;

- if (optind != argc - 1) {
+ if (optind != argc - 1 && optind != argc - 2) {
fprintf(stderr, _("Must specify metapath number.\n"));
return false;
}

for (i = 0; i < XFS_SCRUB_METAPATH_NR; i++) {
if (!strcmp(argv[optind], xfrog_metapaths[i].name)) {
- *ino = i;
- return true;
+ control = i;
+ goto find_group;
}
}

@@ -161,7 +163,32 @@ parse_metapath(
return false;
}

+find_group:
+ if (xfrog_metapaths[control].group == XFROG_SCRUB_GROUP_RTGROUP) {
+ if (optind == argc - 1) {
+ fprintf(stderr,
+_("%s: Metapath requires a group number.\n"),
+ xfrog_metapaths[*ino].name);
+ return false;
+ }
+ control2 = strtoul(argv[optind + 1], &p, 0);
+ if (*p != '\0') {
+ fprintf(stderr,
+ _("Bad group number '%s'.\n"),
+ argv[optind + 1]);
+ return false;
+ }
+ } else {
+ if (optind == argc - 2) {
+ fprintf(stderr,
+_("%s: Metapath does not take a second argument.\n"),
+ xfrog_metapaths[*ino].name);
+ return false;
+ }
+ }
+
*ino = control;
+ *group = control2;
return true;
}

@@ -237,7 +264,8 @@ parse_args(

switch (d->group) {
case XFROG_SCRUB_GROUP_METAPATH:
- if (!parse_metapath(argc, argv, optind, &meta->sm_ino)) {
+ if (!parse_metapath(argc, argv, optind, &meta->sm_ino,
+ &meta->sm_agno)) {
exitcode = 1;
return command_usage(cmdinfo);
}
@@ -582,7 +610,8 @@ scrubv_f(

switch (group) {
case XFROG_SCRUB_GROUP_METAPATH:
- if (!parse_metapath(argc, argv, optind, &scrubv.head.svh_ino)) {
+ if (!parse_metapath(argc, argv, optind, &scrubv.head.svh_ino,
+ &scrubv.head.svh_agno)) {
exitcode = 1;
return command_usage(&scrubv_cmd);
}
diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8
index 6775b0a273e5aa..4673b071901c28 100644
--- a/man/man8/xfs_io.8
+++ b/man/man8/xfs_io.8
@@ -1425,7 +1425,7 @@ .SH FILESYSTEM COMMANDS
.RE
.PD
.TP
-.BI "scrub " type " [ " agnumber " | " rgnumber " | " "ino" " " "gen" " | " metapath " ]"
+.BI "scrub " type " [ " agnumber " | " rgnumber " | " "ino" " " "gen" " | " metapath " [ " rgnumber " ] ]"
Scrub internal XFS filesystem metadata. The
.BI type
parameter specifies which type of metadata to scrub.
@@ -1434,6 +1434,7 @@ .SH FILESYSTEM COMMANDS
For file metadata, the scrub is applied to the open file unless the
inode number and generation number are specified.
For metapath, the name of a file or a raw number must be specified.
+If the metapath file is a per-rtgroup file, the group number must be specified.
.RE
.PD
.TP