]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
xfs: scrub the realtime group superblock
authorDarrick J. Wong <djwong@kernel.org>
Tue, 7 Mar 2023 03:55:28 +0000 (19:55 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Wed, 22 Nov 2023 23:03:34 +0000 (15:03 -0800)
Enable scrubbing of realtime group superblocks.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
io/scrub.c
libfrog/scrub.c
libfrog/scrub.h
libxfs/xfs_fs.h
man/man2/ioctl_xfs_scrub_metadata.2
scrub/repair.c
scrub/scrub.c

index f56552356fa9035fdccba6b87286e762bf069615..96e25a29c852eef08f7f30e01e1e37d2564da552 100644 (file)
@@ -84,6 +84,7 @@ scrub_ioctl(
        switch (sc->group) {
        case XFROG_SCRUB_GROUP_AGHEADER:
        case XFROG_SCRUB_GROUP_PERAG:
+       case XFROG_SCRUB_GROUP_RTGROUP:
                meta.sm_agno = control;
                break;
        case XFROG_SCRUB_GROUP_METAPATH:
@@ -224,6 +225,19 @@ parse_args(
                        return 0;
                }
                break;
+       case XFROG_SCRUB_GROUP_RTGROUP:
+               if (optind != argc - 1) {
+                       fprintf(stderr,
+                               _("Must specify one rtgroup number.\n"));
+                       return 0;
+               }
+               control = strtoul(argv[optind], &p, 0);
+               if (*p != '\0') {
+                       fprintf(stderr,
+                               _("Bad rtgroup number '%s'.\n"), argv[optind]);
+                       return 0;
+               }
+               break;
        default:
                ASSERT(0);
                break;
@@ -326,6 +340,7 @@ repair_ioctl(
        switch (sc->group) {
        case XFROG_SCRUB_GROUP_AGHEADER:
        case XFROG_SCRUB_GROUP_PERAG:
+       case XFROG_SCRUB_GROUP_RTGROUP:
                meta.sm_agno = control;
                break;
        case XFROG_SCRUB_GROUP_METAPATH:
index f48bb1a0d2b7569a8ee75f8077789dcbe9e92477..a9aad03de0d2d85ffa74982318226ca0a2029bd6 100644 (file)
@@ -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] = {
index 5fa0fafef56ac0673d1b5eaf046f7b675845503c..afab2b07fc4c4c5a7926b30ba10204cffb757722 100644 (file)
@@ -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_* */
index c5bf53c6a43ca98aa00c888775d2eccb84094fdc..237d13a500daf84f53adbd971ec6a939c8b94ca0 100644 (file)
@@ -735,9 +735,10 @@ struct xfs_scrub_metadata {
 #define XFS_SCRUB_TYPE_HEALTHY 27      /* everything checked out ok */
 #define XFS_SCRUB_TYPE_DIRTREE 28      /* directory tree structure */
 #define XFS_SCRUB_TYPE_METAPATH        29      /* metadata directory tree paths */
+#define XFS_SCRUB_TYPE_RGSUPER 30      /* realtime superblock */
 
 /* Number of scrub subcommands. */
-#define XFS_SCRUB_TYPE_NR      30
+#define XFS_SCRUB_TYPE_NR      31
 
 /*
  * This special type code only applies to the vectored scrub implementation.
index b1db740560d78b6b5a734a3c4edaebc092ca4774..13f655e2b97bbceaf6175907b72a4e9f50fb1ea9 100644 (file)
@@ -88,6 +88,15 @@ The allocation group number must be given in
 .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
index c6e978c802bd0b0e7fea75388f04ae4bd207187a..8c3ddb839a5307f667f6973b6ddfe2280f05bfdf 100644 (file)
@@ -545,6 +545,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;
                }
index 3e304eef6d7a13895c250dabf2049cee4dfd9376..22fff6a563adfad048da9d9f7d00d176f3960d11 100644 (file)
@@ -98,6 +98,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;
 }