From patchwork Wed Mar 13 02:13:22 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590919 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 036DF12E4E for ; Wed, 13 Mar 2024 02:13:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710296003; cv=none; b=PGeT81YSRDW3fKzfEtj30BTTMLKayStXOQOFKU589Vxm+k5nQN4AE5R73MYc8lPU6I8F+G9mpqnf9CG9aXPv9cdRexPhip8ql589iMsgFA29On7EUKveCXIoCMphzgIdLUH41GXHXoGE6Gr3MXXR80CCqyXW/kU72OZLoyfMiPM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710296003; c=relaxed/simple; bh=33m8uN8HbMwfPGs5GSIKDhhJWt2n4ZkEgrOetw8pvC8=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Oo9ihznoLxRFydRXRz2hSWlSKyumsIwTajqjpyGkBgxKbThQEpPc57giM2+8lgXjFkgIhckXcPnRAKNDTT2vCrCtvLSKnUwAmaK2kwVoy0EZiGsRLGlHL4gT4osTNhgr8qTvvCcH1DZtw89XYl7VuU5k1lIoFNAzvxubJI58W6Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=oXwE6p85; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="oXwE6p85" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 92D77C433F1; Wed, 13 Mar 2024 02:13:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710296002; bh=33m8uN8HbMwfPGs5GSIKDhhJWt2n4ZkEgrOetw8pvC8=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=oXwE6p85D5FOhtlefmPnOaKiWDVMdI/Kx/qLUlyQO/XHXHjHFItxhSn451MYzq27v wUg540EreNiHWFzAHZ90qjZNIgpZj2trCtgSqG6sZ3r4XyFk3EkqUzVfKnNL8pmiVM MP0A1LIGq96Fvvee41vS2Ui2053Mj6nLWQOm/h7QRxGR9EOsRzuMADq5D5zVI2A1Td mtQqZV9Jms54TcY84Lmt/6SPhAxoRC4a9YuSEbQbaU+SQgxk5F0+UEC5wu4JBIYZiY 2NRb2WC7B/DnfHGYskM66tHjlGB2e1t4kCUSMeRAfjCuk3rxvtwhCpmqK8cH9NC01F t03Hcwv1nnihQ== Date: Tue, 12 Mar 2024 19:13:22 -0700 Subject: [PATCH 1/3] libfrog: rename XFROG_SCRUB_TYPE_* to XFROG_SCRUB_GROUP_* From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029433964.2065570.2690498250825367424.stgit@frogsfrogsfrogs> In-Reply-To: <171029433946.2065570.16411233810474878821.stgit@frogsfrogsfrogs> References: <171029433946.2065570.16411233810474878821.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong I didn't do a good job of naming XFROG_SCRUB_TYPE when I created that enumeration. The goal of the enum is to group the scrub ioctl's XFS_SCRUB_TYPE_* codes by principal filesystem object (AG, inode, etc.) but for some dumb reason I chose to reuse "type". This is confusing, so fix this sin. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- io/scrub.c | 12 ++++++------ libfrog/scrub.c | 50 +++++++++++++++++++++++++------------------------- libfrog/scrub.h | 16 ++++++++-------- scrub/scrub.c | 54 +++++++++++++++++++++++++++--------------------------- 4 files changed, 66 insertions(+), 66 deletions(-) diff --git a/io/scrub.c b/io/scrub.c index 403b3a7282ea..d6eda5bea538 100644 --- a/io/scrub.c +++ b/io/scrub.c @@ -166,23 +166,23 @@ parse_args( meta->sm_type = type; meta->sm_flags = flags; - switch (d->type) { - case XFROG_SCRUB_TYPE_INODE: + switch (d->group) { + case XFROG_SCRUB_GROUP_INODE: if (!parse_inode(argc, argv, optind, &meta->sm_ino, &meta->sm_gen)) { exitcode = 1; return command_usage(cmdinfo); } break; - case XFROG_SCRUB_TYPE_AGHEADER: - case XFROG_SCRUB_TYPE_PERAG: + case XFROG_SCRUB_GROUP_AGHEADER: + case XFROG_SCRUB_GROUP_PERAG: if (!parse_agno(argc, argv, optind, &meta->sm_agno)) { exitcode = 1; return command_usage(cmdinfo); } break; - case XFROG_SCRUB_TYPE_FS: - case XFROG_SCRUB_TYPE_NONE: + case XFROG_SCRUB_GROUP_FS: + case XFROG_SCRUB_GROUP_NONE: if (!parse_none(argc, optind)) { exitcode = 1; return command_usage(cmdinfo); diff --git a/libfrog/scrub.c b/libfrog/scrub.c index d900bf2af638..90fc2b1a40cd 100644 --- a/libfrog/scrub.c +++ b/libfrog/scrub.c @@ -12,127 +12,127 @@ const struct xfrog_scrub_descr xfrog_scrubbers[XFS_SCRUB_TYPE_NR] = { [XFS_SCRUB_TYPE_PROBE] = { .name = "probe", .descr = "metadata", - .type = XFROG_SCRUB_TYPE_NONE, + .group = XFROG_SCRUB_GROUP_NONE, }, [XFS_SCRUB_TYPE_SB] = { .name = "sb", .descr = "superblock", - .type = XFROG_SCRUB_TYPE_AGHEADER, + .group = XFROG_SCRUB_GROUP_AGHEADER, }, [XFS_SCRUB_TYPE_AGF] = { .name = "agf", .descr = "free space header", - .type = XFROG_SCRUB_TYPE_AGHEADER, + .group = XFROG_SCRUB_GROUP_AGHEADER, }, [XFS_SCRUB_TYPE_AGFL] = { .name = "agfl", .descr = "free list", - .type = XFROG_SCRUB_TYPE_AGHEADER, + .group = XFROG_SCRUB_GROUP_AGHEADER, }, [XFS_SCRUB_TYPE_AGI] = { .name = "agi", .descr = "inode header", - .type = XFROG_SCRUB_TYPE_AGHEADER, + .group = XFROG_SCRUB_GROUP_AGHEADER, }, [XFS_SCRUB_TYPE_BNOBT] = { .name = "bnobt", .descr = "freesp by block btree", - .type = XFROG_SCRUB_TYPE_PERAG, + .group = XFROG_SCRUB_GROUP_PERAG, }, [XFS_SCRUB_TYPE_CNTBT] = { .name = "cntbt", .descr = "freesp by length btree", - .type = XFROG_SCRUB_TYPE_PERAG, + .group = XFROG_SCRUB_GROUP_PERAG, }, [XFS_SCRUB_TYPE_INOBT] = { .name = "inobt", .descr = "inode btree", - .type = XFROG_SCRUB_TYPE_PERAG, + .group = XFROG_SCRUB_GROUP_PERAG, }, [XFS_SCRUB_TYPE_FINOBT] = { .name = "finobt", .descr = "free inode btree", - .type = XFROG_SCRUB_TYPE_PERAG, + .group = XFROG_SCRUB_GROUP_PERAG, }, [XFS_SCRUB_TYPE_RMAPBT] = { .name = "rmapbt", .descr = "reverse mapping btree", - .type = XFROG_SCRUB_TYPE_PERAG, + .group = XFROG_SCRUB_GROUP_PERAG, }, [XFS_SCRUB_TYPE_REFCNTBT] = { .name = "refcountbt", .descr = "reference count btree", - .type = XFROG_SCRUB_TYPE_PERAG, + .group = XFROG_SCRUB_GROUP_PERAG, }, [XFS_SCRUB_TYPE_INODE] = { .name = "inode", .descr = "inode record", - .type = XFROG_SCRUB_TYPE_INODE, + .group = XFROG_SCRUB_GROUP_INODE, }, [XFS_SCRUB_TYPE_BMBTD] = { .name = "bmapbtd", .descr = "data block map", - .type = XFROG_SCRUB_TYPE_INODE, + .group = XFROG_SCRUB_GROUP_INODE, }, [XFS_SCRUB_TYPE_BMBTA] = { .name = "bmapbta", .descr = "attr block map", - .type = XFROG_SCRUB_TYPE_INODE, + .group = XFROG_SCRUB_GROUP_INODE, }, [XFS_SCRUB_TYPE_BMBTC] = { .name = "bmapbtc", .descr = "CoW block map", - .type = XFROG_SCRUB_TYPE_INODE, + .group = XFROG_SCRUB_GROUP_INODE, }, [XFS_SCRUB_TYPE_DIR] = { .name = "directory", .descr = "directory entries", - .type = XFROG_SCRUB_TYPE_INODE, + .group = XFROG_SCRUB_GROUP_INODE, }, [XFS_SCRUB_TYPE_XATTR] = { .name = "xattr", .descr = "extended attributes", - .type = XFROG_SCRUB_TYPE_INODE, + .group = XFROG_SCRUB_GROUP_INODE, }, [XFS_SCRUB_TYPE_SYMLINK] = { .name = "symlink", .descr = "symbolic link", - .type = XFROG_SCRUB_TYPE_INODE, + .group = XFROG_SCRUB_GROUP_INODE, }, [XFS_SCRUB_TYPE_PARENT] = { .name = "parent", .descr = "parent pointer", - .type = XFROG_SCRUB_TYPE_INODE, + .group = XFROG_SCRUB_GROUP_INODE, }, [XFS_SCRUB_TYPE_RTBITMAP] = { .name = "rtbitmap", .descr = "realtime bitmap", - .type = XFROG_SCRUB_TYPE_FS, + .group = XFROG_SCRUB_GROUP_FS, }, [XFS_SCRUB_TYPE_RTSUM] = { .name = "rtsummary", .descr = "realtime summary", - .type = XFROG_SCRUB_TYPE_FS, + .group = XFROG_SCRUB_GROUP_FS, }, [XFS_SCRUB_TYPE_UQUOTA] = { .name = "usrquota", .descr = "user quotas", - .type = XFROG_SCRUB_TYPE_FS, + .group = XFROG_SCRUB_GROUP_FS, }, [XFS_SCRUB_TYPE_GQUOTA] = { .name = "grpquota", .descr = "group quotas", - .type = XFROG_SCRUB_TYPE_FS, + .group = XFROG_SCRUB_GROUP_FS, }, [XFS_SCRUB_TYPE_PQUOTA] = { .name = "prjquota", .descr = "project quotas", - .type = XFROG_SCRUB_TYPE_FS, + .group = XFROG_SCRUB_GROUP_FS, }, [XFS_SCRUB_TYPE_FSCOUNTERS] = { .name = "fscounters", .descr = "filesystem summary counters", - .type = XFROG_SCRUB_TYPE_FS, + .group = XFROG_SCRUB_GROUP_FS, .flags = XFROG_SCRUB_DESCR_SUMMARY, }, }; diff --git a/libfrog/scrub.h b/libfrog/scrub.h index e43d8c244e48..43a882321f99 100644 --- a/libfrog/scrub.h +++ b/libfrog/scrub.h @@ -6,20 +6,20 @@ #ifndef __LIBFROG_SCRUB_H__ #define __LIBFROG_SCRUB_H__ -/* Type info and names for the scrub types. */ -enum xfrog_scrub_type { - XFROG_SCRUB_TYPE_NONE, /* not metadata */ - XFROG_SCRUB_TYPE_AGHEADER, /* per-AG header */ - XFROG_SCRUB_TYPE_PERAG, /* per-AG metadata */ - XFROG_SCRUB_TYPE_FS, /* per-FS metadata */ - XFROG_SCRUB_TYPE_INODE, /* per-inode metadata */ +/* Group the scrub types by principal filesystem object. */ +enum xfrog_scrub_group { + XFROG_SCRUB_GROUP_NONE, /* not metadata */ + XFROG_SCRUB_GROUP_AGHEADER, /* per-AG header */ + XFROG_SCRUB_GROUP_PERAG, /* per-AG metadata */ + XFROG_SCRUB_GROUP_FS, /* per-FS metadata */ + XFROG_SCRUB_GROUP_INODE, /* per-inode metadata */ }; /* Catalog of scrub types and names, indexed by XFS_SCRUB_TYPE_* */ struct xfrog_scrub_descr { const char *name; const char *descr; - enum xfrog_scrub_type type; + enum xfrog_scrub_group group; unsigned int flags; }; diff --git a/scrub/scrub.c b/scrub/scrub.c index 756f1915ab91..cde9babc5574 100644 --- a/scrub/scrub.c +++ b/scrub/scrub.c @@ -34,21 +34,21 @@ format_scrub_descr( struct xfs_scrub_metadata *meta = where; const struct xfrog_scrub_descr *sc = &xfrog_scrubbers[meta->sm_type]; - switch (sc->type) { - case XFROG_SCRUB_TYPE_AGHEADER: - case XFROG_SCRUB_TYPE_PERAG: + switch (sc->group) { + case XFROG_SCRUB_GROUP_AGHEADER: + case XFROG_SCRUB_GROUP_PERAG: return snprintf(buf, buflen, _("AG %u %s"), meta->sm_agno, _(sc->descr)); break; - case XFROG_SCRUB_TYPE_INODE: + case XFROG_SCRUB_GROUP_INODE: return scrub_render_ino_descr(ctx, buf, buflen, meta->sm_ino, meta->sm_gen, "%s", _(sc->descr)); break; - case XFROG_SCRUB_TYPE_FS: + case XFROG_SCRUB_GROUP_FS: return snprintf(buf, buflen, _("%s"), _(sc->descr)); break; - case XFROG_SCRUB_TYPE_NONE: + case XFROG_SCRUB_GROUP_NONE: assert(0); break; } @@ -276,12 +276,12 @@ scrub_save_repair( memset(aitem, 0, sizeof(*aitem)); aitem->type = meta->sm_type; aitem->flags = meta->sm_flags; - switch (xfrog_scrubbers[meta->sm_type].type) { - case XFROG_SCRUB_TYPE_AGHEADER: - case XFROG_SCRUB_TYPE_PERAG: + switch (xfrog_scrubbers[meta->sm_type].group) { + case XFROG_SCRUB_GROUP_AGHEADER: + case XFROG_SCRUB_GROUP_PERAG: aitem->agno = meta->sm_agno; break; - case XFROG_SCRUB_TYPE_INODE: + case XFROG_SCRUB_GROUP_INODE: aitem->ino = meta->sm_ino; aitem->gen = meta->sm_gen; break; @@ -336,14 +336,14 @@ scrub_meta_type( } /* - * Scrub all metadata types that are assigned to the given XFROG_SCRUB_TYPE_*, + * Scrub all metadata types that are assigned to the given XFROG_SCRUB_GROUP_*, * saving corruption reports for later. This should not be used for - * XFROG_SCRUB_TYPE_INODE or for checking summary metadata. + * XFROG_SCRUB_GROUP_INODE or for checking summary metadata. */ static bool -scrub_all_types( +scrub_group( struct scrub_ctx *ctx, - enum xfrog_scrub_type scrub_type, + enum xfrog_scrub_group group, xfs_agnumber_t agno, struct action_list *alist) { @@ -354,7 +354,7 @@ scrub_all_types( for (type = 0; type < XFS_SCRUB_TYPE_NR; type++, sc++) { int ret; - if (sc->type != scrub_type) + if (sc->group != group) continue; if (sc->flags & XFROG_SCRUB_DESCR_SUMMARY) continue; @@ -388,7 +388,7 @@ scrub_ag_headers( xfs_agnumber_t agno, struct action_list *alist) { - return scrub_all_types(ctx, XFROG_SCRUB_TYPE_AGHEADER, agno, alist); + return scrub_group(ctx, XFROG_SCRUB_GROUP_AGHEADER, agno, alist); } /* Scrub each AG's metadata btrees. */ @@ -398,7 +398,7 @@ scrub_ag_metadata( xfs_agnumber_t agno, struct action_list *alist) { - return scrub_all_types(ctx, XFROG_SCRUB_TYPE_PERAG, agno, alist); + return scrub_group(ctx, XFROG_SCRUB_GROUP_PERAG, agno, alist); } /* Scrub whole-FS metadata btrees. */ @@ -407,7 +407,7 @@ scrub_fs_metadata( struct scrub_ctx *ctx, struct action_list *alist) { - return scrub_all_types(ctx, XFROG_SCRUB_TYPE_FS, 0, alist); + return scrub_group(ctx, XFROG_SCRUB_GROUP_FS, 0, alist); } /* Scrub FS summary metadata. */ @@ -430,12 +430,12 @@ scrub_estimate_ag_work( sc = xfrog_scrubbers; for (type = 0; type < XFS_SCRUB_TYPE_NR; type++, sc++) { - switch (sc->type) { - case XFROG_SCRUB_TYPE_AGHEADER: - case XFROG_SCRUB_TYPE_PERAG: + switch (sc->group) { + case XFROG_SCRUB_GROUP_AGHEADER: + case XFROG_SCRUB_GROUP_PERAG: estimate += ctx->mnt.fsgeom.agcount; break; - case XFROG_SCRUB_TYPE_FS: + case XFROG_SCRUB_GROUP_FS: estimate++; break; default: @@ -463,7 +463,7 @@ scrub_file( enum check_outcome fix; assert(type < XFS_SCRUB_TYPE_NR); - assert(xfrog_scrubbers[type].type == XFROG_SCRUB_TYPE_INODE); + assert(xfrog_scrubbers[type].group == XFROG_SCRUB_GROUP_INODE); meta.sm_type = type; meta.sm_ino = bstat->bs_ino; @@ -625,12 +625,12 @@ xfs_repair_metadata( meta.sm_flags = aitem->flags | XFS_SCRUB_IFLAG_REPAIR; if (use_force_rebuild) meta.sm_flags |= XFS_SCRUB_IFLAG_FORCE_REBUILD; - switch (xfrog_scrubbers[aitem->type].type) { - case XFROG_SCRUB_TYPE_AGHEADER: - case XFROG_SCRUB_TYPE_PERAG: + switch (xfrog_scrubbers[aitem->type].group) { + case XFROG_SCRUB_GROUP_AGHEADER: + case XFROG_SCRUB_GROUP_PERAG: meta.sm_agno = aitem->agno; break; - case XFROG_SCRUB_TYPE_INODE: + case XFROG_SCRUB_GROUP_INODE: meta.sm_ino = aitem->ino; meta.sm_gen = aitem->gen; break; From patchwork Wed Mar 13 02:13:37 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590920 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A8A5512E4E for ; Wed, 13 Mar 2024 02:13:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710296018; cv=none; b=Ptj41Ht7cWaNXYYvYydzw88Gx5LJNfUSQJHNX9UPyoUm19Xjjvq83/jfyqq+AVfjGr1tUctBa0QfU7OY76Yq/FuUls1hkOru7TptkQAROjwglc9rzz0EpK6bhOaq5AW65cUry4+ipfPAb6So1/SPRb076qEJP5jM6yM843CWzXs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710296018; c=relaxed/simple; bh=YoUc+TVgpukWi01X9KHZbaloJQ1zvw25Zzd/j5md6Ac=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=BY2coDe4PFdr7IjJq46zaTIYYwwX/a32jQXYxDu6KpkrJRl1QNT7SXfbHrd0f6IyfBFPCzkrpSL0buR3pooyhzIIRcjB0YBrHYCGdQ+mDxF8XmsVFC14UOYnyT1ZQ1NAh/xha4WAkmautSfRsHYVSxnnAasjl9mW3VAJ3E4xgZo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=cCbFrMPE; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="cCbFrMPE" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 36A65C433F1; Wed, 13 Mar 2024 02:13:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710296018; bh=YoUc+TVgpukWi01X9KHZbaloJQ1zvw25Zzd/j5md6Ac=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=cCbFrMPEjVYPtec3/18vkiW0aKVVxVmDNrjik7NAX3BmhKjtaQxwvfOkY3HDO9I9C +6/la6JYYoXHW2SZFpme3z+rBpPi0gqxHJE1osKcw8kDW17qi8gkIcFd8XzOAked0Q oEV+s/cN5OT+/WKtaHA0E94Uw6xx5bHNkM8x3rJEYxG/cyOkzJ0i9PK740uJrmzTnb eNtI424Qj8Yg4XisnxEN0RNNfI6AmLg7Cdo2GKVTKDmcH4iQH/5Ku3W8mC38EKsLKi DLetndqyuXVNgOgIuLryBt3KZ6xIOM6TkF+yM+xBJ5UCbK6VLWryOSu7hazOAmAX9L Uptz+nf8bLJkw== Date: Tue, 12 Mar 2024 19:13:37 -0700 Subject: [PATCH 2/3] libfrog: promote XFROG_SCRUB_DESCR_SUMMARY to a scrub type From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029433978.2065570.9230970776737199107.stgit@frogsfrogsfrogs> In-Reply-To: <171029433946.2065570.16411233810474878821.stgit@frogsfrogsfrogs> References: <171029433946.2065570.16411233810474878821.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong "Summary" metadata, at least in the scrub context, are metadata whose values depend on some kind of computation and therefore can only be checked after we've looked at all the other metadata. Currently, the superblock summary counters are the only thing that are like this, but since they run in a totally separate xfs_scrub phase (7 vs. 2), make them their own group and remove the group+flag mix. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- io/scrub.c | 1 + libfrog/scrub.c | 3 +-- libfrog/scrub.h | 8 +------- scrub/phase4.c | 2 +- scrub/phase7.c | 4 ++-- scrub/scrub.c | 16 ++++++++++++---- scrub/scrub.h | 3 ++- 7 files changed, 20 insertions(+), 17 deletions(-) diff --git a/io/scrub.c b/io/scrub.c index d6eda5bea538..70301c0676c4 100644 --- a/io/scrub.c +++ b/io/scrub.c @@ -183,6 +183,7 @@ parse_args( break; case XFROG_SCRUB_GROUP_FS: case XFROG_SCRUB_GROUP_NONE: + case XFROG_SCRUB_GROUP_SUMMARY: if (!parse_none(argc, optind)) { exitcode = 1; return command_usage(cmdinfo); diff --git a/libfrog/scrub.c b/libfrog/scrub.c index 90fc2b1a40cd..5a5f522a4258 100644 --- a/libfrog/scrub.c +++ b/libfrog/scrub.c @@ -132,8 +132,7 @@ const struct xfrog_scrub_descr xfrog_scrubbers[XFS_SCRUB_TYPE_NR] = { [XFS_SCRUB_TYPE_FSCOUNTERS] = { .name = "fscounters", .descr = "filesystem summary counters", - .group = XFROG_SCRUB_GROUP_FS, - .flags = XFROG_SCRUB_DESCR_SUMMARY, + .group = XFROG_SCRUB_GROUP_SUMMARY, }, }; diff --git a/libfrog/scrub.h b/libfrog/scrub.h index 43a882321f99..68f1a968103e 100644 --- a/libfrog/scrub.h +++ b/libfrog/scrub.h @@ -13,6 +13,7 @@ enum xfrog_scrub_group { XFROG_SCRUB_GROUP_PERAG, /* per-AG metadata */ XFROG_SCRUB_GROUP_FS, /* per-FS metadata */ XFROG_SCRUB_GROUP_INODE, /* per-inode metadata */ + XFROG_SCRUB_GROUP_SUMMARY, /* summary metadata */ }; /* Catalog of scrub types and names, indexed by XFS_SCRUB_TYPE_* */ @@ -20,15 +21,8 @@ struct xfrog_scrub_descr { const char *name; const char *descr; enum xfrog_scrub_group group; - unsigned int flags; }; -/* - * The type of metadata checked by this scrubber is a summary of other types - * of metadata. This scrubber should be run after all the others. - */ -#define XFROG_SCRUB_DESCR_SUMMARY (1 << 0) - extern const struct xfrog_scrub_descr xfrog_scrubbers[XFS_SCRUB_TYPE_NR]; int xfrog_scrub_metadata(struct xfs_fd *xfd, struct xfs_scrub_metadata *meta); diff --git a/scrub/phase4.c b/scrub/phase4.c index 1228c7cb6545..5dfc3856b82f 100644 --- a/scrub/phase4.c +++ b/scrub/phase4.c @@ -139,7 +139,7 @@ phase4_func( * counters, so counter repairs have to be put on the list now so that * they get fixed before we stop retrying unfixed metadata repairs. */ - ret = scrub_fs_summary(ctx, &ctx->action_lists[0]); + ret = scrub_fs_counters(ctx, &ctx->action_lists[0]); if (ret) return ret; diff --git a/scrub/phase7.c b/scrub/phase7.c index 2fd96053f6cc..93a074f11513 100644 --- a/scrub/phase7.c +++ b/scrub/phase7.c @@ -116,9 +116,9 @@ phase7_func( int ip; int error; - /* Check and fix the fs summary counters. */ + /* Check and fix the summary metadata. */ action_list_init(&alist); - error = scrub_fs_summary(ctx, &alist); + error = scrub_summary_metadata(ctx, &alist); if (error) return error; error = action_list_process(ctx, -1, &alist, diff --git a/scrub/scrub.c b/scrub/scrub.c index cde9babc5574..c7ee074fd36c 100644 --- a/scrub/scrub.c +++ b/scrub/scrub.c @@ -46,6 +46,7 @@ format_scrub_descr( _(sc->descr)); break; case XFROG_SCRUB_GROUP_FS: + case XFROG_SCRUB_GROUP_SUMMARY: return snprintf(buf, buflen, _("%s"), _(sc->descr)); break; case XFROG_SCRUB_GROUP_NONE: @@ -356,8 +357,6 @@ scrub_group( if (sc->group != group) continue; - if (sc->flags & XFROG_SCRUB_DESCR_SUMMARY) - continue; ret = scrub_meta_type(ctx, type, agno, alist); if (ret) @@ -410,9 +409,18 @@ scrub_fs_metadata( return scrub_group(ctx, XFROG_SCRUB_GROUP_FS, 0, alist); } -/* Scrub FS summary metadata. */ +/* Scrub all FS summary metadata. */ int -scrub_fs_summary( +scrub_summary_metadata( + struct scrub_ctx *ctx, + struct action_list *alist) +{ + return scrub_group(ctx, XFROG_SCRUB_GROUP_SUMMARY, 0, alist); +} + +/* Scrub /only/ the superblock summary counters. */ +int +scrub_fs_counters( struct scrub_ctx *ctx, struct action_list *alist) { diff --git a/scrub/scrub.h b/scrub/scrub.h index f7e66bb614b4..35d609f283a4 100644 --- a/scrub/scrub.h +++ b/scrub/scrub.h @@ -23,7 +23,8 @@ int scrub_ag_headers(struct scrub_ctx *ctx, xfs_agnumber_t agno, int scrub_ag_metadata(struct scrub_ctx *ctx, xfs_agnumber_t agno, struct action_list *alist); int scrub_fs_metadata(struct scrub_ctx *ctx, struct action_list *alist); -int scrub_fs_summary(struct scrub_ctx *ctx, struct action_list *alist); +int scrub_summary_metadata(struct scrub_ctx *ctx, struct action_list *alist); +int scrub_fs_counters(struct scrub_ctx *ctx, struct action_list *alist); bool can_scrub_fs_metadata(struct scrub_ctx *ctx); bool can_scrub_inode(struct scrub_ctx *ctx); From patchwork Wed Mar 13 02:13:53 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590921 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0773312E4E for ; Wed, 13 Mar 2024 02:13:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710296034; cv=none; b=FvJd5912RDcguLtYlwEsgN0HlMqGoLSc12N5USGc7T1qCCmUny5WrbKycYEywrXoM41mYLiZXZuc8TdWqIB4FVAzRKaAHAnhS47qZ398HQEITqRE48i3OuXcKOspnJObgI3EsiP0j8dOUPRnFXop75d3fBMuiiw/RYKdvhu0j6I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710296034; c=relaxed/simple; bh=0rprHEFYdoqkhxGu1SYntRrga80jHJVbO26xs8AjeOI=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Fvqz6qg8ybhdaVxj+qVFR3StGA+ofWdymc4h0M0g/xCVTMo2dpRne9Bn4Okks7hvvW79O5MC6v9YfPtH3AWbT3GoOTIAEKYbq2wd1y6gBCdjx1vV9MG1dcWgYoKFClx4EL3DmdlMtH0kpxAVpyDQcNunS3BonLvn727dVBqibso= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=UD3RLfFJ; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="UD3RLfFJ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D5ECEC433F1; Wed, 13 Mar 2024 02:13:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710296033; bh=0rprHEFYdoqkhxGu1SYntRrga80jHJVbO26xs8AjeOI=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=UD3RLfFJK4zlKVnWpJiLi0t3oGmLoiTy22roD/jSmrUtkXfIIvOHTyycIFY9mBpGq UHNfdwWViqzE5P7lM9Dz/wcWpCuzLBTlmka5JwN/3ZTcJK2K2WgEmfqT3NHgSscOhB tjEFTosfu+g51twEwuW0s/hRrhzHK4ryfcTtJPjkx0sNpJ4cJomkhOS0RGnIe7H/JQ 6zI4SF4ZUISrOHoSzGx1cVOgCMBBze5fVL0Qxntalo4EAUTKlOL6pwoWFQ+/ZDrjGW jiNc8ScgckX4xVPUHJyOzPfjw5nV1Ieykp08tgSMGLxXCnfCP8djp00+/mz3+rhF1i LWsXDK2AYppmA== Date: Tue, 12 Mar 2024 19:13:53 -0700 Subject: [PATCH 3/3] xfs_scrub: scan whole-fs metadata files in parallel From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029433992.2065570.7930588015670807806.stgit@frogsfrogsfrogs> In-Reply-To: <171029433946.2065570.16411233810474878821.stgit@frogsfrogsfrogs> References: <171029433946.2065570.16411233810474878821.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong The realtime bitmap and the three quota files are completely independent of each other, which means that we ought to be able to scan them in parallel. Rework the phase2 code so that we can do this. Note, however, that the realtime summary file summarizes the contents of the realtime bitmap, so we must coordinate the workqueue threads. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- scrub/phase2.c | 135 +++++++++++++++++++++++++++++++++++++++++++------------- scrub/scrub.c | 7 ++- scrub/scrub.h | 3 + 3 files changed, 110 insertions(+), 35 deletions(-) diff --git a/scrub/phase2.c b/scrub/phase2.c index 6b88384171f8..80c77b2876ff 100644 --- a/scrub/phase2.c +++ b/scrub/phase2.c @@ -10,6 +10,8 @@ #include "list.h" #include "libfrog/paths.h" #include "libfrog/workqueue.h" +#include "libfrog/fsgeom.h" +#include "libfrog/scrub.h" #include "xfs_scrub.h" #include "common.h" #include "scrub.h" @@ -17,6 +19,18 @@ /* Phase 2: Check internal metadata. */ +struct scan_ctl { + /* + * Control mechanism to signal that the rt bitmap file scan is done and + * wake up any waiters. + */ + pthread_cond_t rbm_wait; + pthread_mutex_t rbm_waitlock; + bool rbm_done; + + bool aborted; +}; + /* Scrub each AG's metadata btrees. */ static void scan_ag_metadata( @@ -25,7 +39,7 @@ scan_ag_metadata( void *arg) { struct scrub_ctx *ctx = (struct scrub_ctx *)wq->wq_ctx; - bool *aborted = arg; + struct scan_ctl *sctl = arg; struct action_list alist; struct action_list immediate_alist; unsigned long long broken_primaries; @@ -33,7 +47,7 @@ scan_ag_metadata( char descr[DESCR_BUFSZ]; int ret; - if (*aborted) + if (sctl->aborted) return; action_list_init(&alist); @@ -89,32 +103,40 @@ _("Filesystem might not be repairable.")); action_list_defer(ctx, agno, &alist); return; err: - *aborted = true; + sctl->aborted = true; } -/* Scrub whole-FS metadata btrees. */ +/* Scan whole-fs metadata. */ static void scan_fs_metadata( - struct workqueue *wq, - xfs_agnumber_t agno, - void *arg) + struct workqueue *wq, + xfs_agnumber_t type, + void *arg) { - struct scrub_ctx *ctx = (struct scrub_ctx *)wq->wq_ctx; - bool *aborted = arg; - struct action_list alist; - int ret; + struct action_list alist; + struct scrub_ctx *ctx = (struct scrub_ctx *)wq->wq_ctx; + struct scan_ctl *sctl = arg; + int ret; - if (*aborted) - return; + if (sctl->aborted) + goto out; action_list_init(&alist); - ret = scrub_fs_metadata(ctx, &alist); + ret = scrub_fs_metadata(ctx, type, &alist); if (ret) { - *aborted = true; - return; + sctl->aborted = true; + goto out; } - action_list_defer(ctx, agno, &alist); + action_list_defer(ctx, 0, &alist); + +out: + if (type == XFS_SCRUB_TYPE_RTBITMAP) { + pthread_mutex_lock(&sctl->rbm_waitlock); + sctl->rbm_done = true; + pthread_cond_broadcast(&sctl->rbm_wait); + pthread_mutex_unlock(&sctl->rbm_waitlock); + } } /* Scan all filesystem metadata. */ @@ -122,17 +144,25 @@ int phase2_func( struct scrub_ctx *ctx) { - struct action_list alist; struct workqueue wq; + struct scan_ctl sctl = { + .aborted = false, + .rbm_done = false, + }; + struct action_list alist; + const struct xfrog_scrub_descr *sc = xfrog_scrubbers; xfs_agnumber_t agno; - bool aborted = false; + unsigned int type; int ret, ret2; + pthread_mutex_init(&sctl.rbm_waitlock, NULL); + pthread_cond_init(&sctl.rbm_wait, NULL); + ret = -workqueue_create(&wq, (struct xfs_mount *)ctx, scrub_nproc_workqueue(ctx)); if (ret) { str_liberror(ctx, ret, _("creating scrub workqueue")); - return ret; + goto out_wait; } /* @@ -143,29 +173,67 @@ phase2_func( action_list_init(&alist); ret = scrub_primary_super(ctx, &alist); if (ret) - goto out; + goto out_wq; ret = action_list_process_or_defer(ctx, 0, &alist); if (ret) - goto out; + goto out_wq; - for (agno = 0; !aborted && agno < ctx->mnt.fsgeom.agcount; agno++) { - ret = -workqueue_add(&wq, scan_ag_metadata, agno, &aborted); + /* Scan each AG in parallel. */ + for (agno = 0; + agno < ctx->mnt.fsgeom.agcount && !sctl.aborted; + agno++) { + ret = -workqueue_add(&wq, scan_ag_metadata, agno, &sctl); if (ret) { str_liberror(ctx, ret, _("queueing per-AG scrub work")); - goto out; + goto out_wq; } } - if (aborted) - goto out; + if (sctl.aborted) + goto out_wq; - ret = -workqueue_add(&wq, scan_fs_metadata, 0, &aborted); + /* + * Scan all of the whole-fs metadata objects: realtime bitmap, realtime + * summary, and the three quota files. Each of the metadata files can + * be scanned in parallel except for the realtime summary file, which + * must run after the realtime bitmap has been scanned. + */ + for (type = 0; type < XFS_SCRUB_TYPE_NR; type++, sc++) { + if (sc->group != XFROG_SCRUB_GROUP_FS) + continue; + if (type == XFS_SCRUB_TYPE_RTSUM) + continue; + + ret = -workqueue_add(&wq, scan_fs_metadata, type, &sctl); + if (ret) { + str_liberror(ctx, ret, + _("queueing whole-fs scrub work")); + goto out_wq; + } + } + + if (sctl.aborted) + goto out_wq; + + /* + * Wait for the rt bitmap to finish scanning, then scan the rt summary + * since the summary can be regenerated completely from the bitmap. + */ + pthread_mutex_lock(&sctl.rbm_waitlock); + while (!sctl.rbm_done) + pthread_cond_wait(&sctl.rbm_wait, &sctl.rbm_waitlock); + pthread_mutex_unlock(&sctl.rbm_waitlock); + + if (sctl.aborted) + goto out_wq; + + ret = -workqueue_add(&wq, scan_fs_metadata, XFS_SCRUB_TYPE_RTSUM, &sctl); if (ret) { - str_liberror(ctx, ret, _("queueing per-FS scrub work")); - goto out; + str_liberror(ctx, ret, _("queueing rtsummary scrub work")); + goto out_wq; } -out: +out_wq: ret2 = -workqueue_terminate(&wq); if (ret2) { str_liberror(ctx, ret2, _("finishing scrub work")); @@ -173,8 +241,11 @@ phase2_func( ret = ret2; } workqueue_destroy(&wq); +out_wait: + pthread_cond_destroy(&sctl.rbm_wait); + pthread_mutex_destroy(&sctl.rbm_waitlock); - if (!ret && aborted) + if (!ret && sctl.aborted) ret = ECANCELED; return ret; } diff --git a/scrub/scrub.c b/scrub/scrub.c index c7ee074fd36c..1c53260cc26c 100644 --- a/scrub/scrub.c +++ b/scrub/scrub.c @@ -400,13 +400,16 @@ scrub_ag_metadata( return scrub_group(ctx, XFROG_SCRUB_GROUP_PERAG, agno, alist); } -/* Scrub whole-FS metadata btrees. */ +/* Scrub whole-filesystem metadata. */ int scrub_fs_metadata( struct scrub_ctx *ctx, + unsigned int type, struct action_list *alist) { - return scrub_group(ctx, XFROG_SCRUB_GROUP_FS, 0, alist); + ASSERT(xfrog_scrubbers[type].group == XFROG_SCRUB_GROUP_FS); + + return scrub_meta_type(ctx, type, 0, alist); } /* Scrub all FS summary metadata. */ diff --git a/scrub/scrub.h b/scrub/scrub.h index 35d609f283a4..8a999da6a965 100644 --- a/scrub/scrub.h +++ b/scrub/scrub.h @@ -22,7 +22,8 @@ int scrub_ag_headers(struct scrub_ctx *ctx, xfs_agnumber_t agno, struct action_list *alist); int scrub_ag_metadata(struct scrub_ctx *ctx, xfs_agnumber_t agno, struct action_list *alist); -int scrub_fs_metadata(struct scrub_ctx *ctx, struct action_list *alist); +int scrub_fs_metadata(struct scrub_ctx *ctx, unsigned int scrub_type, + struct action_list *alist); int scrub_summary_metadata(struct scrub_ctx *ctx, struct action_list *alist); int scrub_fs_counters(struct scrub_ctx *ctx, struct action_list *alist);