Commit f42c6524 authored by Christoph Hellwig's avatar Christoph Hellwig
Browse files

xfs: support XFS_BMAPI_REMAP in xfs_bmap_del_extent_delay



The zone allocator wants to be able to remove a delalloc mapping in the
COW fork while keeping the block reservation.  To support that pass the
flags argument down to xfs_bmap_del_extent_delay and support the
XFS_BMAPI_REMAP flag to keep the reservation.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatar"Darrick J. Wong" <djwong@kernel.org>
parent 6fff1752
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -4667,7 +4667,8 @@ xfs_bmap_del_extent_delay(
	int			whichfork,
	struct xfs_iext_cursor	*icur,
	struct xfs_bmbt_irec	*got,
	struct xfs_bmbt_irec	*del)
	struct xfs_bmbt_irec	*del,
	uint32_t		bflags)	/* bmapi flags */
{
	struct xfs_mount	*mp = ip->i_mount;
	struct xfs_ifork	*ifp = xfs_ifork_ptr(ip, whichfork);
@@ -4787,7 +4788,9 @@ xfs_bmap_del_extent_delay(
	da_diff = da_old - da_new;
	fdblocks = da_diff;

	if (isrt)
	if (bflags & XFS_BMAPI_REMAP)
		;
	else if (isrt)
		xfs_add_frextents(mp, xfs_blen_to_rtbxlen(mp, del->br_blockcount));
	else
		fdblocks += del->br_blockcount;
@@ -5389,7 +5392,8 @@ __xfs_bunmapi(

delete:
		if (wasdel) {
			xfs_bmap_del_extent_delay(ip, whichfork, &icur, &got, &del);
			xfs_bmap_del_extent_delay(ip, whichfork, &icur, &got,
					&del, flags);
		} else {
			error = xfs_bmap_del_extent_real(ip, tp, &icur, cur,
					&del, &tmp_logflags, whichfork,
+1 −1
Original line number Diff line number Diff line
@@ -204,7 +204,7 @@ int xfs_bunmapi(struct xfs_trans *tp, struct xfs_inode *ip,
		xfs_extnum_t nexts, int *done);
void	xfs_bmap_del_extent_delay(struct xfs_inode *ip, int whichfork,
		struct xfs_iext_cursor *cur, struct xfs_bmbt_irec *got,
		struct xfs_bmbt_irec *del);
		struct xfs_bmbt_irec *del, uint32_t bflags);
void	xfs_bmap_del_extent_cow(struct xfs_inode *ip,
		struct xfs_iext_cursor *cur, struct xfs_bmbt_irec *got,
		struct xfs_bmbt_irec *del);
+1 −1
Original line number Diff line number Diff line
@@ -467,7 +467,7 @@ xfs_bmap_punch_delalloc_range(
			continue;
		}

		xfs_bmap_del_extent_delay(ip, whichfork, &icur, &got, &del);
		xfs_bmap_del_extent_delay(ip, whichfork, &icur, &got, &del, 0);
		if (!xfs_iext_get_extent(ifp, &icur, &got))
			break;
	}
+1 −1
Original line number Diff line number Diff line
@@ -651,7 +651,7 @@ xfs_reflink_cancel_cow_blocks(

		if (isnullstartblock(del.br_startblock)) {
			xfs_bmap_del_extent_delay(ip, XFS_COW_FORK, &icur, &got,
					&del);
					&del, 0);
		} else if (del.br_state == XFS_EXT_UNWRITTEN || cancel_real) {
			ASSERT((*tpp)->t_highest_agno == NULLAGNUMBER);