]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_io: support scrubbing metadata directory paths
authorDarrick J. Wong <djwong@kernel.org>
Thu, 21 Nov 2024 00:24:16 +0000 (16:24 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 24 Dec 2024 02:01:26 +0000 (18:01 -0800)
Support invoking the metadata directory path scrubber from xfs_io for
testing.

Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
io/scrub.c
man/man8/xfs_io.8

index e03c1d0eaf1db8603c352d8786824105ed3676c1..45229a8ae810994aca7038267dc08f46ebcebf51 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");
 }
 
@@ -125,6 +131,40 @@ parse_none(
        return true;
 }
 
+static bool
+parse_metapath(
+       int             argc,
+       char            **argv,
+       int             optind,
+       __u64           *ino)
+{
+       char            *p;
+       unsigned long long control;
+       int             i;
+
+       if (optind != argc - 1) {
+               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 = strtoll(argv[optind], &p, 0);
+       if (*p != '\0') {
+               fprintf(stderr, _("Bad metapath number '%s'.\n"),
+                               argv[optind]);
+               return false;
+       }
+
+       *ino = control;
+       return true;
+}
+
 static int
 parse_args(
        int                             argc,
@@ -170,6 +210,12 @@ parse_args(
        meta->sm_flags = flags;
 
        switch (d->group) {
+       case XFROG_SCRUB_GROUP_METAPATH:
+               if (!parse_metapath(argc, argv, optind, &meta->sm_ino)) {
+                       exitcode = 1;
+                       return command_usage(cmdinfo);
+               }
+               break;
        case XFROG_SCRUB_GROUP_INODE:
                if (!parse_inode(argc, argv, optind, &meta->sm_ino,
                                                     &meta->sm_gen)) {
@@ -244,7 +290,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;
 
@@ -275,6 +321,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");
 }
 
@@ -327,7 +379,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;
 
@@ -495,6 +547,12 @@ scrubv_f(
        optind++;
 
        switch (group) {
+       case XFROG_SCRUB_GROUP_METAPATH:
+               if (!parse_metapath(argc, argv, optind, &scrubv.head.svh_ino)) {
+                       exitcode = 1;
+                       return command_usage(&scrubv_cmd);
+               }
+               break;
        case XFROG_SCRUB_GROUP_INODE:
                if (!parse_inode(argc, argv, optind, &scrubv.head.svh_ino,
                                                     &scrubv.head.svh_gen)) {
index fb7a026224fda71a38a4017f611de1bc6e8d5893..c73fee7c2780c6c3e43513db817a506004f12c14 100644 (file)
@@ -1425,13 +1425,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