]> www.infradead.org Git - users/hch/xfs.git/commitdiff
xfs: support XFS_BMAPI_REMAP in xfs_bmap_del_extent_delay
authorChristoph Hellwig <hch@lst.de>
Tue, 10 Sep 2024 04:58:17 +0000 (07:58 +0300)
committerChristoph Hellwig <hch@lst.de>
Mon, 3 Feb 2025 04:49:08 +0000 (05:49 +0100)
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
blags 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>
fs/xfs/libxfs/xfs_bmap.c
fs/xfs/libxfs/xfs_bmap.h
fs/xfs/xfs_bmap_util.c
fs/xfs/xfs_reflink.c

index 861945a5fce347058daa24c7eaf824655071365d..512f1ceca47fceb574f6499a69a6550b4d81cb0f 100644 (file)
@@ -4666,7 +4666,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);
@@ -4786,7 +4787,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;
@@ -5388,7 +5391,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);
index 0836fea2d6d8144e4cb8bea929f6824f9f334a81..c623688e457c81a882d6c05f7b6ac7141a1e6ac7 100644 (file)
@@ -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;
        }
index fd65e5d7994a5e934e2f80704263267ad0b0187a..b977930c4ebc11abb78d12cc5279174d2eff6da9 100644 (file)
@@ -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);