]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
xfs: support XFS_BMAPI_REMAP in xfs_bmap_del_extent_delay
authorChristoph Hellwig <hch@lst.de>
Tue, 8 Apr 2025 07:08:31 +0000 (09:08 +0200)
committerChristoph Hellwig <hch@lst.de>
Tue, 8 Apr 2025 07:08:31 +0000 (09:08 +0200)
Source kernel commit: f42c652434de5e26e02798bf6a0c2a4a8627196b

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>
Signed-off-by: Christoph Hellwig <hch@lst.de>
libxfs/xfs_bmap.c
libxfs/xfs_bmap.h

index 4dc66e77744fb12989b9887e9c30dc3e32c58bd9..c40cdf004ac9f5eb6de8d1f39f12eaebea51f4ba 100644 (file)
@@ -4662,7 +4662,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);
@@ -4782,7 +4783,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;
@@ -5384,7 +5387,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,
index 4d48087fd3a8ee46eea87fe8ebf3fe0193e2e791..b4d9c6e0f3f9b6dc23172901201e951ef905ee73 100644 (file)
@@ -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);