Commit 9c3cfb9c authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Darrick J. Wong
Browse files

xfs: add a xfs_bmap_free_rtblocks helper



Split the RT extent freeing logic from xfs_bmap_del_extent_real because
it will become more complicated when adding RT group.

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 cd5b26f0
Loading
Loading
Loading
Loading
+22 −11
Original line number Diff line number Diff line
@@ -5116,6 +5116,27 @@ xfs_bmap_del_extent_cow(
	ip->i_delayed_blks -= del->br_blockcount;
}

static int
xfs_bmap_free_rtblocks(
	struct xfs_trans	*tp,
	struct xfs_bmbt_irec	*del)
{
	int			error;

	/*
	 * Ensure the bitmap and summary inodes are locked and joined to the
	 * transaction before modifying them.
	 */
	if (!(tp->t_flags & XFS_TRANS_RTBITMAP_LOCKED)) {
		tp->t_flags |= XFS_TRANS_RTBITMAP_LOCKED;
		xfs_rtbitmap_lock(tp->t_mountp);
		xfs_rtbitmap_trans_join(tp);
	}

	error = xfs_rtfree_blocks(tp, del->br_startblock, del->br_blockcount);
	return error;
}

/*
 * Called by xfs_bmapi to update file extent records and the btree
 * after removing space.
@@ -5331,17 +5352,7 @@ xfs_bmap_del_extent_real(
		if (xfs_is_reflink_inode(ip) && whichfork == XFS_DATA_FORK) {
			xfs_refcount_decrease_extent(tp, del);
		} else if (xfs_ifork_is_realtime(ip, whichfork)) {
			/*
			 * Ensure the bitmap and summary inodes are locked
			 * and joined to the transaction before modifying them.
			 */
			if (!(tp->t_flags & XFS_TRANS_RTBITMAP_LOCKED)) {
				tp->t_flags |= XFS_TRANS_RTBITMAP_LOCKED;
				xfs_rtbitmap_lock(mp);
				xfs_rtbitmap_trans_join(tp);
			}
			error = xfs_rtfree_blocks(tp, del->br_startblock,
					del->br_blockcount);
			error = xfs_bmap_free_rtblocks(tp, del);
		} else {
			unsigned int	efi_flags = 0;