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

xfs: don't merge ioends across RTGs



Unlike AGs, RTGs don't always have metadata in their first blocks, and
thus we don't get automatic protection from merging I/O completions
across RTG boundaries.  Add code to set the IOMAP_F_BOUNDARY flag for
ioends that start at the first block of a RTG so that they never get
merged into the previous ioend.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
parent 44e69c9a
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -188,6 +188,15 @@ xfs_rtb_to_rgbno(
	return __xfs_rtb_to_rgbno(mp, rtbno);
}

/* Is rtbno the start of a RT group? */
static inline bool
xfs_rtbno_is_group_start(
	struct xfs_mount	*mp,
	xfs_rtblock_t		rtbno)
{
	return (rtbno & mp->m_rgblkmask) == 0;
}

static inline xfs_daddr_t
xfs_rtb_to_daddr(
	struct xfs_mount	*mp,
+12 −1
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@
#include "xfs_iomap.h"
#include "xfs_trace.h"
#include "xfs_quota.h"
#include "xfs_rtgroup.h"
#include "xfs_dquot_item.h"
#include "xfs_dquot.h"
#include "xfs_reflink.h"
@@ -115,7 +116,9 @@ xfs_bmbt_to_iomap(
		iomap->addr = IOMAP_NULL_ADDR;
		iomap->type = IOMAP_DELALLOC;
	} else {
		iomap->addr = BBTOB(xfs_fsb_to_db(ip, imap->br_startblock));
		xfs_daddr_t	daddr = xfs_fsb_to_db(ip, imap->br_startblock);

		iomap->addr = BBTOB(daddr);
		if (mapping_flags & IOMAP_DAX)
			iomap->addr += target->bt_dax_part_off;

@@ -124,6 +127,14 @@ xfs_bmbt_to_iomap(
		else
			iomap->type = IOMAP_MAPPED;

		/*
		 * Mark iomaps starting at the first sector of a RTG as merge
		 * boundary so that each I/O completions is contained to a
		 * single RTG.
		 */
		if (XFS_IS_REALTIME_INODE(ip) && xfs_has_rtgroups(mp) &&
		    xfs_rtbno_is_group_start(mp, imap->br_startblock))
			iomap->flags |= IOMAP_F_BOUNDARY;
	}
	iomap->offset = XFS_FSB_TO_B(mp, imap->br_startoff);
	iomap->length = XFS_FSB_TO_B(mp, imap->br_blockcount);