]> www.infradead.org Git - users/hch/xfs.git/commitdiff
xfs: don't call xfs_can_free_eofblocks from ->release for zoned inodes
authorChristoph Hellwig <hch@lst.de>
Thu, 21 Nov 2024 07:50:23 +0000 (08:50 +0100)
committerChristoph Hellwig <hch@lst.de>
Mon, 3 Feb 2025 04:49:10 +0000 (05:49 +0100)
Zoned file systems require out of place writes and thus can't support
post-EOF speculative preallocations.  Avoid the pointless ilock critical
section to find out that none can be freed.

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

index 807e85e16a52f0c6d4ca42bd7d6f56480bc400be..dc27a6c36bf7522fa0bd673e88db4c4022607d04 100644 (file)
@@ -1356,15 +1356,22 @@ xfs_file_release(
         * blocks.  This avoids open/read/close workloads from removing EOF
         * blocks that other writers depend upon to reduce fragmentation.
         *
+        * Inodes on the zoned RT device never have preallocations, so skip
+        * taking the locks below.
+        */
+       if (!inode->i_nlink ||
+           !(file->f_mode & FMODE_WRITE) ||
+           (ip->i_diflags & XFS_DIFLAG_APPEND) ||
+           xfs_is_zoned_inode(ip))
+               return 0;
+
+       /*
         * If we can't get the iolock just skip truncating the blocks past EOF
         * because we could deadlock with the mmap_lock otherwise. We'll get
         * another chance to drop them once the last reference to the inode is
         * dropped, so we'll never leak blocks permanently.
         */
-       if (inode->i_nlink &&
-           (file->f_mode & FMODE_WRITE) &&
-           !(ip->i_diflags & XFS_DIFLAG_APPEND) &&
-           !xfs_iflags_test(ip, XFS_EOFBLOCKS_RELEASED) &&
+       if (!xfs_iflags_test(ip, XFS_EOFBLOCKS_RELEASED) &&
            xfs_ilock_nowait(ip, XFS_IOLOCK_EXCL)) {
                if (xfs_can_free_eofblocks(ip) &&
                    !xfs_iflags_test_and_set(ip, XFS_EOFBLOCKS_RELEASED))