xfs: refactor repair forcing tests into a repair.c helper
authorDarrick J. Wong <djwong@kernel.org>
Fri, 15 Dec 2023 18:03:39 +0000 (10:03 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Fri, 15 Dec 2023 18:03:39 +0000 (10:03 -0800)
There are a couple of conditions that userspace can set to force repairs
of metadata.  These really belong in the repair code and not open-coded
into the check code, so refactor them into a helper.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/scrub/repair.c
fs/xfs/scrub/repair.h
fs/xfs/scrub/scrub.c

index 26d65175ae8bc689466c87e8673115524eef73df..020d49b0f9b927dda37de54565c4eec1b5bc5668 100644 (file)
@@ -27,6 +27,8 @@
 #include "xfs_quota.h"
 #include "xfs_qm.h"
 #include "xfs_defer.h"
+#include "xfs_errortag.h"
+#include "xfs_error.h"
 #include "scrub/scrub.h"
 #include "scrub/common.h"
 #include "scrub/trace.h"
@@ -940,3 +942,23 @@ xrep_reset_perag_resv(
 out:
        return error;
 }
+
+/* Decide if we are going to call the repair function for a scrub type. */
+bool
+xrep_will_attempt(
+       struct xfs_scrub        *sc)
+{
+       /* Userspace asked us to rebuild the structure regardless. */
+       if (sc->sm->sm_flags & XFS_SCRUB_IFLAG_FORCE_REBUILD)
+               return true;
+
+       /* Let debug users force us into the repair routines. */
+       if (XFS_TEST_ERROR(false, sc->mp, XFS_ERRTAG_FORCE_SCRUB_REPAIR))
+               return true;
+
+       /* Metadata is corrupt or failed cross-referencing. */
+       if (xchk_needs_repair(sc->sm))
+               return true;
+
+       return false;
+}
index 8aa8b8889e399d83802f642f7405abbfcb3b6cb6..51ba3df5998cc7d083b663c2bce83914eb6ae1ef 100644 (file)
@@ -28,6 +28,7 @@ static inline int xrep_notsupported(struct xfs_scrub *sc)
 /* Repair helpers */
 
 int xrep_attempt(struct xfs_scrub *sc, struct xchk_stats_run *run);
+bool xrep_will_attempt(struct xfs_scrub *sc);
 void xrep_failure(struct xfs_mount *mp);
 int xrep_roll_ag_trans(struct xfs_scrub *sc);
 int xrep_roll_trans(struct xfs_scrub *sc);
@@ -117,6 +118,7 @@ int xrep_reinit_pagi(struct xfs_scrub *sc);
 #else
 
 #define xrep_ino_dqattach(sc)  (0)
+#define xrep_will_attempt(sc)  (false)
 
 static inline int
 xrep_attempt(
index 238ead205c52ee95de805aa7b9ae2047659fe793..c9e37c68808954124f518b60f19180fc46b2cabd 100644 (file)
@@ -14,8 +14,6 @@
 #include "xfs_inode.h"
 #include "xfs_quota.h"
 #include "xfs_qm.h"
-#include "xfs_errortag.h"
-#include "xfs_error.h"
 #include "xfs_scrub.h"
 #include "scrub/scrub.h"
 #include "scrub/common.h"
@@ -550,21 +548,11 @@ retry_op:
        xchk_update_health(sc);
 
        if (xchk_could_repair(sc)) {
-               bool needs_fix = xchk_needs_repair(sc->sm);
-
-               /* Userspace asked us to rebuild the structure regardless. */
-               if (sc->sm->sm_flags & XFS_SCRUB_IFLAG_FORCE_REBUILD)
-                       needs_fix = true;
-
-               /* Let debug users force us into the repair routines. */
-               if (XFS_TEST_ERROR(needs_fix, mp, XFS_ERRTAG_FORCE_SCRUB_REPAIR))
-                       needs_fix = true;
-
                /*
                 * If userspace asked for a repair but it wasn't necessary,
                 * report that back to userspace.
                 */
-               if (!needs_fix) {
+               if (!xrep_will_attempt(sc)) {
                        sc->sm->sm_flags |= XFS_SCRUB_OFLAG_NO_REPAIR_NEEDED;
                        goto out_nofix;
                }