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

xfs: create helpers to deal with rounding xfs_fileoff_t to rtx boundaries



We're about to segment xfs_rtblock_t addresses, so we must create
type-specific helpers to do rt extent rounding of file block offsets
because the rtb helpers soon will not do the right thing there.

Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
parent ea99122b
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -135,13 +135,22 @@ xfs_rtb_roundup_rtx(
	return roundup_64(rtbno, mp->m_sb.sb_rextsize);
}

/* Round this rtblock down to the nearest rt extent size. */
/* Round this file block offset up to the nearest rt extent size. */
static inline xfs_rtblock_t
xfs_rtb_rounddown_rtx(
xfs_fileoff_roundup_rtx(
	struct xfs_mount	*mp,
	xfs_rtblock_t		rtbno)
	xfs_fileoff_t		off)
{
	return roundup_64(off, mp->m_sb.sb_rextsize);
}

/* Round this file block offset down to the nearest rt extent size. */
static inline xfs_rtblock_t
xfs_fileoff_rounddown_rtx(
	struct xfs_mount	*mp,
	xfs_fileoff_t		off)
{
	return rounddown_64(rtbno, mp->m_sb.sb_rextsize);
	return rounddown_64(off, mp->m_sb.sb_rextsize);
}

/* Convert an rt extent number to a file block offset in the rt bitmap file. */
+3 −3
Original line number Diff line number Diff line
@@ -541,7 +541,7 @@ xfs_can_free_eofblocks(
	 */
	end_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)XFS_ISIZE(ip));
	if (xfs_inode_has_bigrtalloc(ip))
		end_fsb = xfs_rtb_roundup_rtx(mp, end_fsb);
		end_fsb = xfs_fileoff_roundup_rtx(mp, end_fsb);
	last_fsb = XFS_B_TO_FSB(mp, mp->m_super->s_maxbytes);
	if (last_fsb <= end_fsb)
		return false;
@@ -863,8 +863,8 @@ xfs_free_file_space(

	/* We can only free complete realtime extents. */
	if (xfs_inode_has_bigrtalloc(ip)) {
		startoffset_fsb = xfs_rtb_roundup_rtx(mp, startoffset_fsb);
		endoffset_fsb = xfs_rtb_rounddown_rtx(mp, endoffset_fsb);
		startoffset_fsb = xfs_fileoff_roundup_rtx(mp, startoffset_fsb);
		endoffset_fsb = xfs_fileoff_rounddown_rtx(mp, endoffset_fsb);
	}

	/*