]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iomap: make buffered writes work with RWF_DONTCACHE
authorJens Axboe <axboe@kernel.dk>
Tue, 4 Feb 2025 18:39:59 +0000 (11:39 -0700)
committerChristian Brauner <brauner@kernel.org>
Thu, 27 Feb 2025 10:20:59 +0000 (11:20 +0100)
Add iomap buffered write support for RWF_DONTCACHE. If RWF_DONTCACHE is
set for a write, mark the folios being written as uncached. Then
writeback completion will drop the pages. The write_iter handler simply
kicks off writeback for the pages, and writeback completion will take
care of the rest.

Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Link: https://lore.kernel.org/r/20250204184047.356762-2-axboe@kernel.dk
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Christian Brauner <brauner@kernel.org>
Documentation/filesystems/iomap/design.rst
Documentation/filesystems/iomap/operations.rst
fs/iomap/buffered-io.c
include/linux/iomap.h

index 28ab3758c474ec505174ab4890bde01ff33fd982..e29651a42eec2228d911e4be350636c3950b4679 100644 (file)
@@ -356,6 +356,11 @@ operations:
    ``IOMAP_NOWAIT`` is often set on behalf of ``IOCB_NOWAIT`` or
    ``RWF_NOWAIT``.
 
+ * ``IOMAP_DONTCACHE`` is set when the caller wishes to perform a
+   buffered file I/O and would like the kernel to drop the pagecache
+   after the I/O completes, if it isn't already being used by another
+   thread.
+
 If it is necessary to read existing file contents from a `different
 <https://lore.kernel.org/all/20191008071527.29304-9-hch@lst.de/>`_
 device or address range on a device, the filesystem should return that
index 04fc7a49067dd350c23bb81c39fa57082f601536..d1535109587ab2afd1ec850f48f3fecc38a1aecd 100644 (file)
@@ -131,6 +131,8 @@ These ``struct kiocb`` flags are significant for buffered I/O with iomap:
 
  * ``IOCB_NOWAIT``: Turns on ``IOMAP_NOWAIT``.
 
+ * ``IOCB_DONTCACHE``: Turns on ``IOMAP_DONTCACHE``.
+
 Internal per-Folio State
 ------------------------
 
index ea5e32d810d50fc89f0c91c7e60f245c53d9f46f..d52cfdc299c4e3c8a24e656fdcc9ff20c617c1f5 100644 (file)
@@ -594,6 +594,8 @@ struct folio *iomap_get_folio(struct iomap_iter *iter, loff_t pos, size_t len)
 
        if (iter->flags & IOMAP_NOWAIT)
                fgp |= FGP_NOWAIT;
+       if (iter->flags & IOMAP_DONTCACHE)
+               fgp |= FGP_DONTCACHE;
        fgp |= fgf_set_order(len);
 
        return __filemap_get_folio(iter->inode->i_mapping, pos >> PAGE_SHIFT,
@@ -1019,6 +1021,8 @@ iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *i,
 
        if (iocb->ki_flags & IOCB_NOWAIT)
                iter.flags |= IOMAP_NOWAIT;
+       if (iocb->ki_flags & IOCB_DONTCACHE)
+               iter.flags |= IOMAP_DONTCACHE;
 
        while ((ret = iomap_iter(&iter, ops)) > 0)
                iter.status = iomap_write_iter(&iter, i);
index 1fd66bc29cc1b3417131cecb78aa2ccbdec68fd9..ea29388b2fba234ca5d3fa99cb58368127afe315 100644 (file)
@@ -190,6 +190,7 @@ struct iomap_folio_ops {
 #define IOMAP_DAX              0
 #endif /* CONFIG_FS_DAX */
 #define IOMAP_ATOMIC           (1 << 9)
+#define IOMAP_DONTCACHE                (1 << 10)
 
 struct iomap_ops {
        /*