]> www.infradead.org Git - linux.git/commitdiff
iomap: add a private argument for iomap_file_buffered_write
authorJosef Bacik <josef@toxicpanda.com>
Tue, 27 Aug 2024 10:51:36 +0000 (06:51 -0400)
committerChristian Brauner <brauner@kernel.org>
Tue, 3 Sep 2024 13:01:23 +0000 (15:01 +0200)
In order to switch fuse over to using iomap for buffered writes we need
to be able to have the struct file for the original write, in case we
have to read in the page to make it uptodate.  Handle this by using the
existing private field in the iomap_iter, and add the argument to
iomap_file_buffered_write.  This will allow us to pass the file in
through the iomap buffered write path, and is flexible for any other
file systems needs.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Link: https://lore.kernel.org/r/7f55c7c32275004ba00cddf862d970e6e633f750.1724755651.git.josef@toxicpanda.com
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Christian Brauner <brauner@kernel.org>
block/fops.c
fs/gfs2/file.c
fs/iomap/buffered-io.c
fs/xfs/xfs_file.c
fs/zonefs/file.c
include/linux/iomap.h

index 9825c1713a49a98a9e9e6ff705b96c7fc10d038d..d16a6dddb12a97ccd2bf1ff959dfddbc69451f59 100644 (file)
@@ -665,7 +665,7 @@ blkdev_direct_write(struct kiocb *iocb, struct iov_iter *from)
 
 static ssize_t blkdev_buffered_write(struct kiocb *iocb, struct iov_iter *from)
 {
-       return iomap_file_buffered_write(iocb, from, &blkdev_iomap_ops);
+       return iomap_file_buffered_write(iocb, from, &blkdev_iomap_ops, NULL);
 }
 
 /*
index 08982937b5df53bc7acec01987d4d3db6063936f..f7dd64856c9bffa511a031d97308eb5e92f721ab 100644 (file)
@@ -1057,7 +1057,7 @@ retry:
        }
 
        pagefault_disable();
-       ret = iomap_file_buffered_write(iocb, from, &gfs2_iomap_ops);
+       ret = iomap_file_buffered_write(iocb, from, &gfs2_iomap_ops, NULL);
        pagefault_enable();
        if (ret > 0)
                written += ret;
index d745f718bcde854aabf5d0ea2f316840cab9b4ca..e79d117015530968babe004bae9c6ccb25310111 100644 (file)
@@ -1022,13 +1022,14 @@ retry:
 
 ssize_t
 iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *i,
-               const struct iomap_ops *ops)
+               const struct iomap_ops *ops, void *private)
 {
        struct iomap_iter iter = {
                .inode          = iocb->ki_filp->f_mapping->host,
                .pos            = iocb->ki_pos,
                .len            = iov_iter_count(i),
                .flags          = IOMAP_WRITE,
+               .private        = private,
        };
        ssize_t ret;
 
index 4cdc54dc96862e2af50a5dbd5951be2588d3a282..e9c693bb20bc1fb9c6286f891dfa57db57ab7d80 100644 (file)
@@ -760,7 +760,7 @@ write_retry:
 
        trace_xfs_file_buffered_write(iocb, from);
        ret = iomap_file_buffered_write(iocb, from,
-                       &xfs_buffered_write_iomap_ops);
+                       &xfs_buffered_write_iomap_ops, NULL);
 
        /*
         * If we hit a space limit, try to free up some lingering preallocated
index 3b103715acc90fe28a303d356f2a43d9b71f3eb6..35166c92420c481737f08f6ec27b8d6e6d9fc71a 100644 (file)
@@ -563,7 +563,7 @@ static ssize_t zonefs_file_buffered_write(struct kiocb *iocb,
        if (ret <= 0)
                goto inode_unlock;
 
-       ret = iomap_file_buffered_write(iocb, from, &zonefs_write_iomap_ops);
+       ret = iomap_file_buffered_write(iocb, from, &zonefs_write_iomap_ops, NULL);
        if (ret == -EIO)
                zonefs_io_error(inode, true);
 
index 6fc1c858013d1e4dda4ed38fa4083acf25d16d36..f792b37f762736bb61a8a5e9aad14c2e5e2136ed 100644 (file)
@@ -257,7 +257,7 @@ static inline const struct iomap *iomap_iter_srcmap(const struct iomap_iter *i)
 }
 
 ssize_t iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *from,
-               const struct iomap_ops *ops);
+               const struct iomap_ops *ops, void *private);
 int iomap_file_buffered_write_punch_delalloc(struct inode *inode,
                struct iomap *iomap, loff_t pos, loff_t length, ssize_t written,
                int (*punch)(struct inode *inode, loff_t pos, loff_t length));