From: Darrick J. Wong <djwong@xxxxxxxxxx> Support scrubbing the metadata directory path of an rtgroup metadata file. Signed-off-by: "Darrick J. Wong" <djwong@xxxxxxxxxx> Reviewed-by: Christoph Hellwig <hch@xxxxxx> --- 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