xfs: wire up zoned block freeing in xfs_rtextent_free_finish_item
authorChristoph Hellwig <hch@lst.de>
Sun, 17 Nov 2024 07:19:22 +0000 (08:19 +0100)
committerChristoph Hellwig <hch@lst.de>
Mon, 3 Mar 2025 15:17:07 +0000 (08:17 -0700)
Make xfs_rtextent_free_finish_item call into the zoned allocator to free
blocks on zoned RT devices.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
fs/xfs/xfs_extfree_item.c

index a25c713ff888c7c773c8fd4f87751feee82e1ffd..777438b853da0a206c48d307238f9e652a54305a 100644 (file)
@@ -29,6 +29,7 @@
 #include "xfs_inode.h"
 #include "xfs_rtbitmap.h"
 #include "xfs_rtgroup.h"
+#include "xfs_zone_alloc.h"
 
 struct kmem_cache      *xfs_efi_cache;
 struct kmem_cache      *xfs_efd_cache;
@@ -767,21 +768,35 @@ xfs_rtextent_free_finish_item(
 
        trace_xfs_extent_free_deferred(mp, xefi);
 
-       if (!(xefi->xefi_flags & XFS_EFI_CANCELLED)) {
-               if (*rtgp != to_rtg(xefi->xefi_group)) {
-                       *rtgp = to_rtg(xefi->xefi_group);
-                       xfs_rtgroup_lock(*rtgp, XFS_RTGLOCK_BITMAP);
-                       xfs_rtgroup_trans_join(tp, *rtgp,
-                                       XFS_RTGLOCK_BITMAP);
-               }
-               error = xfs_rtfree_blocks(tp, *rtgp,
-                               xefi->xefi_startblock, xefi->xefi_blockcount);
+       if (xefi->xefi_flags & XFS_EFI_CANCELLED)
+               goto done;
+
+       if (*rtgp != to_rtg(xefi->xefi_group)) {
+               unsigned int            lock_flags;
+
+               if (xfs_has_zoned(mp))
+                       lock_flags = XFS_RTGLOCK_RMAP;
+               else
+                       lock_flags = XFS_RTGLOCK_BITMAP;
+
+               *rtgp = to_rtg(xefi->xefi_group);
+               xfs_rtgroup_lock(*rtgp, lock_flags);
+               xfs_rtgroup_trans_join(tp, *rtgp, lock_flags);
        }
+
+       if (xfs_has_zoned(mp)) {
+               error = xfs_zone_free_blocks(tp, *rtgp, xefi->xefi_startblock,
+                               xefi->xefi_blockcount);
+       } else {
+               error = xfs_rtfree_blocks(tp, *rtgp, xefi->xefi_startblock,
+                               xefi->xefi_blockcount);
+       }
+
        if (error == -EAGAIN) {
                xfs_efd_from_efi(efdp);
                return error;
        }
-
+done:
        xfs_efd_add_extent(efdp, xefi);
        xfs_extent_free_cancel_item(item);
        return error;