]> www.infradead.org Git - users/hch/xfs.git/commitdiff
xfs: allow overlapping rtrmapbt records for shared data extents
authorDarrick J. Wong <djwong@kernel.org>
Tue, 15 Oct 2024 19:40:34 +0000 (12:40 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Fri, 1 Nov 2024 20:47:12 +0000 (13:47 -0700)
Allow overlapping realtime reverse mapping records if they both describe
shared data extents and the fs supports reflink on the realtime volume.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
fs/xfs/scrub/rtrmap.c

index 6add6378289d9bbd1dbbd8868b1fca73af6d8e41..dc464749fbe3ce5151abbb9faaecf613ac925a43 100644 (file)
@@ -79,6 +79,18 @@ struct xchk_rtrmap {
        struct xfs_rmap_irec    prev_rec;
 };
 
+static inline bool
+xchk_rtrmapbt_is_shareable(
+       struct xfs_scrub                *sc,
+       const struct xfs_rmap_irec      *irec)
+{
+       if (!xfs_has_rtreflink(sc->mp))
+               return false;
+       if (irec->rm_flags & XFS_RMAP_UNWRITTEN)
+               return false;
+       return true;
+}
+
 /* Flag failures for records that overlap but cannot. */
 STATIC void
 xchk_rtrmapbt_check_overlapping(
@@ -100,7 +112,10 @@ xchk_rtrmapbt_check_overlapping(
        if (pnext <= irec->rm_startblock)
                goto set_prev;
 
-       xchk_btree_set_corrupt(bs->sc, bs->cur, 0);
+       /* Overlap is only allowed if both records are data fork mappings. */
+       if (!xchk_rtrmapbt_is_shareable(bs->sc, &cr->overlap_rec) ||
+           !xchk_rtrmapbt_is_shareable(bs->sc, irec))
+               xchk_btree_set_corrupt(bs->sc, bs->cur, 0);
 
        /* Save whichever rmap record extends furthest. */
        inext = irec->rm_startblock + irec->rm_blockcount;