Commit 7333c948 authored by Darrick J. Wong's avatar Darrick J. Wong
Browse files

xfs: don't coalesce file mappings that cross rtgroup boundaries in scrub



The bmbt scrubber will combine file mappings if they are mergeable to
reduce the number of cross-referencing checks.  However, we shouldn't
combine mappings that cross rt group boundaries because that will cause
verifiers to trip incorrectly.

Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
parent d162491c
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
@@ -834,9 +834,12 @@ xchk_bmap_iext_mapping(
/* Are these two mappings contiguous with each other? */
static inline bool
xchk_are_bmaps_contiguous(
	const struct xchk_bmap_info	*info,
	const struct xfs_bmbt_irec	*b1,
	const struct xfs_bmbt_irec	*b2)
{
	struct xfs_mount		*mp = info->sc->mp;

	/* Don't try to combine unallocated mappings. */
	if (!xfs_bmap_is_real_extent(b1))
		return false;
@@ -850,6 +853,17 @@ xchk_are_bmaps_contiguous(
		return false;
	if (b1->br_state != b2->br_state)
		return false;

	/*
	 * Don't combine bmaps that would cross rtgroup boundaries.  This is a
	 * valid state, but if combined they will fail rtb extent checks.
	 */
	if (info->is_rt && xfs_has_rtgroups(mp)) {
		if (xfs_rtb_to_rgno(mp, b1->br_startblock) !=
		    xfs_rtb_to_rgno(mp, b2->br_startblock))
			return false;
	}

	return true;
}

@@ -887,7 +901,7 @@ xchk_bmap_iext_iter(
	 * that we just read, if possible.
	 */
	while (xfs_iext_peek_next_extent(ifp, &info->icur, &got)) {
		if (!xchk_are_bmaps_contiguous(irec, &got))
		if (!xchk_are_bmaps_contiguous(info, irec, &got))
			break;

		if (!xchk_bmap_iext_mapping(info, &got)) {