]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
xfs_repair: flag suspect long-format btree blocks
authorDarrick J. Wong <djwong@kernel.org>
Thu, 15 Aug 2024 18:57:38 +0000 (11:57 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Fri, 16 Aug 2024 21:57:41 +0000 (14:57 -0700)
Pass a "suspect" counter through scan_lbtree just like we do for
short-format btree blocks, and increment its value when we encounter
blocks with bad CRCs or outright corruption.  This makes it so that
repair actually catches bmbt blocks with bad crcs or other verifier
errors.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
repair/dinode.c
repair/scan.c
repair/scan.h

index 6faa87f1aaa5dfe9860bc5239c745c6f9f4b9f4c..8cbd9eafbdf5b01fe6d7bb7f6f53bd48b9e5f606 100644 (file)
@@ -923,7 +923,7 @@ _("bad bmap btree ptr 0x%" PRIx64 " in ino %" PRIu64 "\n"),
 
                if (scan_lbtree(get_unaligned_be64(&pp[i]), level, scan_bmapbt,
                                type, whichfork, lino, tot, nex, blkmapp,
-                               &cursor, 1, check_dups, magic,
+                               &cursor, 0, 1, check_dups, magic,
                                (void *)zap_metadata, &xfs_bmbt_buf_ops))
                        return(1);
                /*
index 221d660e81fdb47c17a57ac17d73711058cfde75..2e4453478a107e2f2bb0875aa9b6b87600583c1b 100644 (file)
@@ -136,6 +136,7 @@ scan_lbtree(
                                xfs_extnum_t            *nex,
                                blkmap_t                **blkmapp,
                                bmap_cursor_t           *bm_cursor,
+                               int                     suspect,
                                int                     isroot,
                                int                     check_dups,
                                int                     *dirty,
@@ -148,6 +149,7 @@ scan_lbtree(
        xfs_extnum_t    *nex,
        blkmap_t        **blkmapp,
        bmap_cursor_t   *bm_cursor,
+       int             suspect,
        int             isroot,
        int             check_dups,
        uint64_t        magic,
@@ -167,6 +169,12 @@ scan_lbtree(
                        XFS_FSB_TO_AGBNO(mp, root));
                return(1);
        }
+       if (bp->b_error == -EFSBADCRC || bp->b_error == -EFSCORRUPTED) {
+               do_warn(_("btree block %d/%d is suspect, error %d\n"),
+                       XFS_FSB_TO_AGNO(mp, root),
+                       XFS_FSB_TO_AGBNO(mp, root), bp->b_error);
+               suspect++;
+       }
 
        /*
         * only check for bad CRC here - caller will determine if there
@@ -182,7 +190,7 @@ scan_lbtree(
 
        err = (*func)(XFS_BUF_TO_BLOCK(bp), nlevels - 1,
                        type, whichfork, root, ino, tot, nex, blkmapp,
-                       bm_cursor, isroot, check_dups, &dirty,
+                       bm_cursor, suspect, isroot, check_dups, &dirty,
                        magic, priv);
 
        ASSERT(dirty == 0 || (dirty && !no_modify));
@@ -209,6 +217,7 @@ scan_bmapbt(
        xfs_extnum_t            *nex,
        blkmap_t                **blkmapp,
        bmap_cursor_t           *bm_cursor,
+       int                     suspect,
        int                     isroot,
        int                     check_dups,
        int                     *dirty,
@@ -505,7 +514,7 @@ _("bad bmap btree ptr 0x%llx in ino %" PRIu64 "\n"),
 
                err = scan_lbtree(be64_to_cpu(pp[i]), level, scan_bmapbt,
                                type, whichfork, ino, tot, nex, blkmapp,
-                               bm_cursor, 0, check_dups, magic, priv,
+                               bm_cursor, suspect, 0, check_dups, magic, priv,
                                &xfs_bmbt_buf_ops);
                if (err)
                        return(1);
@@ -573,7 +582,7 @@ _("bad fwd (right) sibling pointer (saw %" PRIu64 " should be NULLFSBLOCK)\n"
                                be64_to_cpu(pkey[numrecs - 1].br_startoff);
        }
 
-       return(0);
+       return suspect > 0 ? 1 : 0;
 }
 
 static void
index 4da788becbef667924bf57e8fe2fcd0e5345c530..aeaf9f1a7f4ba9bcb32114d43c31068284456cc1 100644 (file)
@@ -23,6 +23,7 @@ int scan_lbtree(
                                xfs_extnum_t            *nex,
                                struct blkmap           **blkmapp,
                                bmap_cursor_t           *bm_cursor,
+                               int                     suspect,
                                int                     isroot,
                                int                     check_dups,
                                int                     *dirty,
@@ -35,6 +36,7 @@ int scan_lbtree(
        xfs_extnum_t    *nex,
        struct blkmap   **blkmapp,
        bmap_cursor_t   *bm_cursor,
+       int             suspect,
        int             isroot,
        int             check_dups,
        uint64_t        magic,
@@ -52,6 +54,7 @@ int scan_bmapbt(
        xfs_extnum_t            *nex,
        struct blkmap           **blkmapp,
        bmap_cursor_t           *bm_cursor,
+       int                     suspect,
        int                     isroot,
        int                     check_dups,
        int                     *dirty,