fs: Pass an iocb to generic_perform_write()
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Sun, 20 Feb 2022 04:19:49 +0000 (23:19 -0500)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Fri, 1 Apr 2022 18:40:44 +0000 (14:40 -0400)
We can extract both the file pointer and the pos from the iocb.
This simplifies each caller as well as allowing generic_perform_write()
to see more of the iocb contents in the future.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Christian Brauner <brauner@kernel.org>
Reviewed-by: Al Viro <viro@zeniv.linux.org.uk>
Acked-by: Al Viro <viro@zeniv.linux.org.uk>
fs/ceph/file.c
fs/ext4/file.c
fs/f2fs/file.c
fs/nfs/file.c
include/linux/fs.h
mm/filemap.c

index feb75eb..6c9e837 100644 (file)
@@ -1869,7 +1869,7 @@ retry_snap:
                 * are pending vmtruncate. So write and vmtruncate
                 * can not run at the same time
                 */
-               written = generic_perform_write(file, from, pos);
+               written = generic_perform_write(iocb, from);
                if (likely(written >= 0))
                        iocb->ki_pos = pos + written;
                ceph_end_io_write(inode);
index 8bd66cd..6feb07e 100644 (file)
@@ -267,7 +267,7 @@ static ssize_t ext4_buffered_write_iter(struct kiocb *iocb,
                goto out;
 
        current->backing_dev_info = inode_to_bdi(inode);
-       ret = generic_perform_write(iocb->ki_filp, from, iocb->ki_pos);
+       ret = generic_perform_write(iocb, from);
        current->backing_dev_info = NULL;
 
 out:
index d3f39a7..5b89af0 100644 (file)
@@ -4448,7 +4448,7 @@ static ssize_t f2fs_buffered_write_iter(struct kiocb *iocb,
                return -EOPNOTSUPP;
 
        current->backing_dev_info = inode_to_bdi(inode);
-       ret = generic_perform_write(file, from, iocb->ki_pos);
+       ret = generic_perform_write(iocb, from);
        current->backing_dev_info = NULL;
 
        if (ret > 0) {
index b0ca244..150b7fa 100644 (file)
@@ -646,7 +646,7 @@ ssize_t nfs_file_write(struct kiocb *iocb, struct iov_iter *from)
        result = generic_write_checks(iocb, from);
        if (result > 0) {
                current->backing_dev_info = inode_to_bdi(inode);
-               result = generic_perform_write(file, from, iocb->ki_pos);
+               result = generic_perform_write(iocb, from);
                current->backing_dev_info = NULL;
        }
        nfs_end_io_write(inode);
index 8ff2893..468dc7e 100644 (file)
@@ -2999,7 +2999,7 @@ extern ssize_t generic_file_read_iter(struct kiocb *, struct iov_iter *);
 extern ssize_t __generic_file_write_iter(struct kiocb *, struct iov_iter *);
 extern ssize_t generic_file_write_iter(struct kiocb *, struct iov_iter *);
 extern ssize_t generic_file_direct_write(struct kiocb *, struct iov_iter *);
-extern ssize_t generic_perform_write(struct file *, struct iov_iter *, loff_t);
+ssize_t generic_perform_write(struct kiocb *, struct iov_iter *);
 
 ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos,
                rwf_t flags);
index d904cd7..3a5ffb5 100644 (file)
@@ -3752,9 +3752,10 @@ out:
 }
 EXPORT_SYMBOL(generic_file_direct_write);
 
-ssize_t generic_perform_write(struct file *file,
-                               struct iov_iter *i, loff_t pos)
+ssize_t generic_perform_write(struct kiocb *iocb, struct iov_iter *i)
 {
+       struct file *file = iocb->ki_filp;
+       loff_t pos = iocb->ki_pos;
        struct address_space *mapping = file->f_mapping;
        const struct address_space_operations *a_ops = mapping->a_ops;
        long status = 0;
@@ -3884,7 +3885,8 @@ ssize_t __generic_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
                if (written < 0 || !iov_iter_count(from) || IS_DAX(inode))
                        goto out;
 
-               status = generic_perform_write(file, from, pos = iocb->ki_pos);
+               pos = iocb->ki_pos;
+               status = generic_perform_write(iocb, from);
                /*
                 * If generic_perform_write() returned a synchronous error
                 * then we want to return the number of bytes which were
@@ -3916,7 +3918,7 @@ ssize_t __generic_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
                         */
                }
        } else {
-               written = generic_perform_write(file, from, iocb->ki_pos);
+               written = generic_perform_write(iocb, from);
                if (likely(written > 0))
                        iocb->ki_pos += written;
        }