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: Christoph Hellwig <hch@lst.de> Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user