]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iomap: remove old partial eof zeroing optimization
authorBrian Foster <bfoster@redhat.com>
Fri, 3 Oct 2025 13:46:40 +0000 (09:46 -0400)
committerChristian Brauner <brauner@kernel.org>
Wed, 5 Nov 2025 11:57:25 +0000 (12:57 +0100)
iomap_zero_range() optimizes the partial eof block zeroing use case
by force zeroing if the mapping is dirty. This is to avoid frequent
flushing on file extending workloads, which hurts performance.

Now that the folio batch mechanism provides a more generic solution
and is used by the only real zero range user (XFS), this isolated
optimization is no longer needed. Remove the unnecessary code and
let callers use the folio batch or fall back to flushing by default.

Signed-off-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/iomap/buffered-io.c

index 1cabd9b0249ed47c041b728cb6c65b828bc7b6c2..6ae031ac805818cce6bd501a12b0df4b1dd676d2 100644 (file)
@@ -1518,34 +1518,9 @@ iomap_zero_range(struct inode *inode, loff_t pos, loff_t len, bool *did_zero,
                .private        = private,
        };
        struct address_space *mapping = inode->i_mapping;
-       unsigned int blocksize = i_blocksize(inode);
-       unsigned int off = pos & (blocksize - 1);
-       loff_t plen = min_t(loff_t, len, blocksize - off);
        int ret;
        bool range_dirty;
 
-       /*
-        * Zero range can skip mappings that are zero on disk so long as
-        * pagecache is clean. If pagecache was dirty prior to zero range, the
-        * mapping converts on writeback completion and so must be zeroed.
-        *
-        * The simplest way to deal with this across a range is to flush
-        * pagecache and process the updated mappings. To avoid excessive
-        * flushing on partial eof zeroing, special case it to zero the
-        * unaligned start portion if already dirty in pagecache.
-        */
-       if (!iter.fbatch && off &&
-           filemap_range_needs_writeback(mapping, pos, pos + plen - 1)) {
-               iter.len = plen;
-               while ((ret = iomap_iter(&iter, ops)) > 0)
-                       iter.status = iomap_zero_iter(&iter, did_zero,
-                                       write_ops);
-
-               iter.len = len - (iter.pos - pos);
-               if (ret || !iter.len)
-                       return ret;
-       }
-
        /*
         * To avoid an unconditional flush, check pagecache state and only flush
         * if dirty and the fs returns a mapping that might convert on