]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
xfs_io: support scrubbing metadata directory paths
authorDarrick J. Wong <djwong@kernel.org>
Fri, 18 Aug 2023 17:06:28 +0000 (10:06 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Wed, 22 Nov 2023 23:03:31 +0000 (15:03 -0800)
Support invoking the metadata directory path scrubber from xfs_io for
testing.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
io/scrub.c
man/man8/xfs_io.8

index ea7d5204cdca1ab92fee5e91d8e85e46e0cc1784..f56552356fa9035fdccba6b87286e762bf069615 100644 (file)
@@ -41,6 +41,12 @@ scrub_help(void)
 " Known metadata scrub types are:"));
        for (i = 0, d = xfrog_scrubbers; i < XFS_SCRUB_TYPE_NR; i++, d++)
                printf(" %s", d->name);
+       printf(_(
+"\n"
+"\n"
+" Known metapath scrub arguments are:"));
+       for (i = 0, d = xfrog_metapaths; i < XFS_SCRUB_METAPATH_NR; i++, d++)
+               printf(" %s", d->name);
        printf("\n");
 }
 
@@ -142,6 +148,33 @@ parse_args(
        optind++;
 
        switch (d->group) {
+       case XFROG_SCRUB_GROUP_METAPATH:
+               if (optind == argc - 1) {
+                       bool    set = false;
+
+                       for (i = 0; i < XFS_SCRUB_METAPATH_NR; i++) {
+                               if (!strcmp(argv[optind],
+                                               xfrog_metapaths[i].name)) {
+                                       control = i;
+                                       set = true;
+                                       break;
+                               }
+                       }
+
+                       if (!set) {
+                               control = strtoull(argv[optind], &p, 0);
+                               if (*p != '\0') {
+                                       fprintf(stderr,
+ _("Bad metapath number '%s'.\n"),
+                                               argv[optind]);
+                                       return 0;
+                               }
+                       }
+               } else {
+                       fprintf(stderr, _("Must specify metapath number.\n"));
+                       return 0;
+               }
+               break;
        case XFROG_SCRUB_GROUP_INODE:
                if (optind == argc) {
                        control = 0;
@@ -217,7 +250,7 @@ scrub_init(void)
        scrub_cmd.argmin = 1;
        scrub_cmd.argmax = -1;
        scrub_cmd.flags = CMD_NOMAP_OK;
-       scrub_cmd.args = _("type [agno|ino gen]");
+       scrub_cmd.args = _("type [agno|ino gen|metapath]");
        scrub_cmd.oneline = _("scrubs filesystem metadata");
        scrub_cmd.help = scrub_help;
 
@@ -248,6 +281,12 @@ repair_help(void)
 " Known metadata repair types are:"));
        for (i = 0, d = xfrog_scrubbers; i < XFS_SCRUB_TYPE_NR; i++, d++)
                printf(" %s", d->name);
+       printf(_(
+"\n"
+"\n"
+" Known metapath repair arguments are:"));
+       for (i = 0, d = xfrog_metapaths; i < XFS_SCRUB_METAPATH_NR; i++, d++)
+               printf(" %s", d->name);
        printf("\n");
 }
 
@@ -330,7 +369,7 @@ repair_init(void)
        repair_cmd.argmin = 1;
        repair_cmd.argmax = -1;
        repair_cmd.flags = CMD_NOMAP_OK;
-       repair_cmd.args = _("type [agno|ino gen]");
+       repair_cmd.args = _("type [agno|ino gen|metapath]");
        repair_cmd.oneline = _("repairs filesystem metadata");
        repair_cmd.help = repair_help;
 
@@ -494,6 +533,22 @@ scrubv_f(
        optind++;
 
        switch (group) {
+       case XFROG_SCRUB_GROUP_METAPATH:
+               if (optind == argc - 1) {
+                       vhead->svh_ino = strtoull(argv[optind], &p, 0);
+                       if (*p != '\0') {
+                               fprintf(stderr,
+                                       _("Bad metapath number '%s'.\n"),
+                                       argv[optind]);
+                               return 0;
+                       }
+                       vhead->svh_gen = 0;
+               } else {
+                       fprintf(stderr,
+                               _("Must specify metapath number.\n"));
+                       return 0;
+               }
+               break;
        case XFROG_SCRUB_GROUP_INODE:
                if (optind == argc) {
                        vhead->svh_ino = 0;
index 3f0ed21c5081276f7ea8907341825594edc0b44e..734c31a161ee5466c03ef7b87335e744121f350c 100644 (file)
@@ -1419,13 +1419,14 @@ Currently supported versions are 1 and 5.
 .RE
 .PD
 .TP
-.BI "scrub " type " [ " agnumber " | " "ino" " " "gen" " ]"
+.BI "scrub " type " [ " agnumber " | " "ino" " " "gen" " | " metapath " ]"
 Scrub internal XFS filesystem metadata.  The
 .BI type
 parameter specifies which type of metadata to scrub.
 For AG metadata, one AG number must be specified.
 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.
 .RE
 .PD
 .TP