]> www.infradead.org Git - users/hch/xfs.git/commitdiff
xfs: kick off inodegc when failing to reserve zoned blocks xfs-zoned-fixes
authorChristoph Hellwig <hch@lst.de>
Wed, 13 Aug 2025 06:07:15 +0000 (08:07 +0200)
committerChristoph Hellwig <hch@lst.de>
Fri, 15 Aug 2025 10:51:54 +0000 (12:51 +0200)
XFS processes truncating unlinked inodes asynchronously and thus the free
space pool only sees them with a delay.  The non-zoned write path thus
calls into inodegc to accelerate this processing before failing an
allocation due the lack of free blocks.  Do the same for the zoned space
reservation.

Fixes: 0bb2193056b5 ("xfs: add support for zoned space reservations")
Signed-off-by: Christoph Hellwig <hch@lst.de>
fs/xfs/xfs_zone_space_resv.c

index 1313c55b8cbe512ca7cf1f45d43aad075d12fefc..9cd38716fd25f60e008582cda0c2b610e0c24bf0 100644 (file)
@@ -10,6 +10,7 @@
 #include "xfs_mount.h"
 #include "xfs_inode.h"
 #include "xfs_rtbitmap.h"
+#include "xfs_icache.h"
 #include "xfs_zone_alloc.h"
 #include "xfs_zone_priv.h"
 #include "xfs_zones.h"
@@ -230,6 +231,11 @@ xfs_zoned_space_reserve(
 
        error = xfs_dec_freecounter(mp, XC_FREE_RTEXTENTS, count_fsb,
                        flags & XFS_ZR_RESERVED);
+       if (error == -ENOSPC && !(flags & XFS_ZR_NOWAIT)) {
+               xfs_inodegc_flush(mp);
+               error = xfs_dec_freecounter(mp, XC_FREE_RTEXTENTS, count_fsb,
+                               flags & XFS_ZR_RESERVED);
+       }
        if (error == -ENOSPC && (flags & XFS_ZR_GREEDY) && count_fsb > 1)
                error = xfs_zoned_reserve_extents_greedy(mp, &count_fsb, flags);
        if (error)