]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
xfs: fix error returns in CoW fork repair
authorYingjie Gao <gaoyingjie@uniontech.com>
Wed, 27 May 2026 04:31:33 +0000 (12:31 +0800)
committerCarlos Maiolino <cem@kernel.org>
Sat, 30 May 2026 06:26:18 +0000 (08:26 +0200)
xrep_cow_find_bad() returns success after the cleanup labels even if
AG setup, btree queries, or bitmap updates failed. This can make
repair continue with an incomplete bad-file-offset bitmap instead of
stopping at the original error.

The force-rebuild path has a related cleanup problem. If
xrep_cow_mark_file_range() fails, the function returns directly and
skips the scrub AG context and perag cleanup.

Let the force-rebuild path fall through to the existing cleanup code
and return the saved error after cleanup.

Fixes: dbbdbd008632 ("xfs: repair problems in CoW forks")
Cc: <stable@vger.kernel.org> # v6.8
Signed-off-by: Yingjie Gao <gaoyingjie@uniontech.com>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
fs/xfs/scrub/cow_repair.c

index bffc4666ce60ab12dfeb09d56c1c63a3217a99b1..a6ff09ace43df65f70a1f11c3c2db55414c22561 100644 (file)
@@ -300,18 +300,15 @@ xrep_cow_find_bad(
         * on the debugging knob, replace everything in the CoW fork.
         */
        if ((sc->sm->sm_flags & XFS_SCRUB_IFLAG_FORCE_REBUILD) ||
-           XFS_TEST_ERROR(sc->mp, XFS_ERRTAG_FORCE_SCRUB_REPAIR)) {
+           XFS_TEST_ERROR(sc->mp, XFS_ERRTAG_FORCE_SCRUB_REPAIR))
                error = xrep_cow_mark_file_range(xc, xc->irec.br_startblock,
                                xc->irec.br_blockcount);
-               if (error)
-                       return error;
-       }
 
 out_sa:
        xchk_ag_free(sc, &sc->sa);
 out_pag:
        xfs_perag_put(pag);
-       return 0;
+       return error;
 }
 
 /*