This syncs file_operations::read_iter()/write_iter() declarations with
mainstream versions.

We brought _iter() interface before it appeared in mainstream and
callbacks declarations are not in sync.

Usually this does not hurt, but zfs is a bit upset that we have
address_space_operations::direct_IO() which uses iters, but
file_operations::read_iter()/write_iter() are not implemented (they are
implemented in vz kernel, but have different declaration, thus not
detected correctly).

So, let's make zfs happy.

To_merge: eddb0e72476d ("fs/aio: kernel direct aio")

Signed-off-by: Konstantin Khorenko <khore...@virtuozzo.com>
---
 fs/aio.c           |  4 ++--
 fs/ext4/file.c     | 29 +++++++++++++++--------------
 include/linux/fs.h |  8 ++++----
 mm/filemap.c       | 24 ++++++++++++------------
 4 files changed, 33 insertions(+), 32 deletions(-)

diff --git a/fs/aio.c b/fs/aio.c
index f1b27fc5defb..f0a9e1613529 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -1343,7 +1343,7 @@ static ssize_t aio_read_iter(struct kiocb *iocb)
        if (!file->f_op->read_iter)
                return -EINVAL;
 
-       return file->f_op->read_iter(iocb, iocb->ki_iter, iocb->ki_pos);
+       return file->f_op->read_iter(iocb, iocb->ki_iter);
 }
 
 static ssize_t aio_write_iter(struct kiocb *iocb)
@@ -1365,7 +1365,7 @@ static ssize_t aio_write_iter(struct kiocb *iocb)
                return -EINVAL;
 
        file_start_write(file);
-       ret = file->f_op->write_iter(iocb, iocb->ki_iter, iocb->ki_pos);
+       ret = file->f_op->write_iter(iocb, iocb->ki_iter);
        file_end_write(file);
        return ret;
 }
diff --git a/fs/ext4/file.c b/fs/ext4/file.c
index 67a385e9f716..2b3a73f90163 100644
--- a/fs/ext4/file.c
+++ b/fs/ext4/file.c
@@ -318,26 +318,26 @@ ext4_file_dax_write(
 #endif
 
 static ssize_t
-ext4_file_write_iter(struct kiocb *iocb, struct iov_iter *iter, loff_t pos)
+ext4_file_write_iter(struct kiocb *iocb, struct iov_iter *iter)
 {
        struct inode *inode = file_inode(iocb->ki_filp);
        ssize_t ret;
        int overwrite = 0;
 
-       ret = ext4_write_checks(iocb, iter, &pos);
+       ret = ext4_write_checks(iocb, iter, &iocb->ki_pos);
        if (ret <= 0)
                return ret;
 
 #ifdef CONFIG_FS_DAX
        if (IS_DAX(inode))
-               return ext4_file_dax_write(iocb, iter, pos);
+               return ext4_file_dax_write(iocb, iter, iocb->ki_pos);
 #endif
 
        iocb->private = &overwrite; /* RHEL7 only - prevent DIO race */
        if (unlikely(io_is_direct(iocb->ki_filp)))
-               ret = ext4_file_dio_write(iocb, iter, pos);
+               ret = ext4_file_dio_write(iocb, iter, iocb->ki_pos);
        else
-               ret = generic_file_write_iter(iocb, iter, pos);
+               ret = generic_file_write_iter(iocb, iter);
 
        return ret;
 }
@@ -350,7 +350,8 @@ ext4_file_write(struct kiocb *iocb, const struct iovec *iov,
 
        iov_iter_init(&iter, iov, nr_segs, iov_length(iov, nr_segs), 0);
 
-       return ext4_file_write_iter(iocb, &iter, pos);
+       BUG_ON(iocb->ki_pos != pos);
+       return ext4_file_write_iter(iocb, &iter);
 }
 
 #ifdef CONFIG_FS_DAX
@@ -585,8 +586,7 @@ loff_t ext4_llseek(struct file *file, loff_t offset, int 
whence)
 static ssize_t
 ext4_file_dax_read_iter(
        struct kiocb            *iocb,
-       struct iov_iter         *iter,
-       loff_t                  pos)
+       struct iov_iter         *iter)
 {
        size_t                  size = iov_iter_count(iter);
        ssize_t                 ret = 0;
@@ -603,10 +603,10 @@ ext4_file_dax_read_iter(
        if (!IS_DAX(inode)) {
                inode_unlock(inode);
                /* Fallback to buffered IO in case we cannot support DAX */
-               return generic_file_read_iter(iocb, iter, pos);
+               return generic_file_read_iter(iocb, iter);
        }
 
-       ret = dax_iomap_rw(READ, iocb, iter, pos,
+       ret = dax_iomap_rw(READ, iocb, iter, iocb->ki_pos,
                                        size, &ext4_iomap_ops);
        inode_unlock(inode);
 
@@ -616,13 +616,13 @@ ext4_file_dax_read_iter(
 #endif
 
 ssize_t
-ext4_file_read_iter(struct kiocb *iocb, struct iov_iter *iter, loff_t pos)
+ext4_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
 {
 #ifdef CONFIG_FS_DAX
        if (IS_DAX(file_inode(iocb->ki_filp)))
-               return ext4_file_dax_read_iter(iocb, iter, pos);
+               return ext4_file_dax_read_iter(iocb, iter);
 #endif
-       return generic_file_read_iter(iocb, iter, pos);
+       return generic_file_read_iter(iocb, iter);
 }
 
 static ssize_t
@@ -636,7 +636,8 @@ ext4_file_read(
        struct iov_iter iter;
 
        iov_iter_init(&iter, iovp, nr_segs, size, 0);
-       return ext4_file_read_iter(iocb, &iter, pos);
+       BUG_ON(iocb->ki_pos != pos);
+       return ext4_file_read_iter(iocb, &iter);
 }
 
 const struct file_operations_extend  ext4_file_operations = {
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 8398ec202a42..2f498238202a 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1969,9 +1969,9 @@ struct file_operations {
        ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
        ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
        ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned 
long, loff_t);
-       ssize_t (*read_iter) (struct kiocb *, struct iov_iter *, loff_t);
+       ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);
        ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned 
long, loff_t);
-       ssize_t (*write_iter) (struct kiocb *, struct iov_iter *, loff_t);
+       ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);
        int (*readdir) (struct file *, void *, filldir_t);
        unsigned int (*poll) (struct file *, struct poll_table_struct *);
        long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
@@ -3239,12 +3239,12 @@ extern int generic_file_readonly_mmap(struct file *, 
struct vm_area_struct *);
 extern int file_read_actor(read_descriptor_t * desc, struct page *page, 
unsigned long offset, unsigned long size);
 int generic_write_checks(struct file *file, loff_t *pos, size_t *count, int 
isblk);
 extern ssize_t generic_file_aio_read(struct kiocb *, const struct iovec *, 
unsigned long, loff_t);
-extern ssize_t generic_file_read_iter(struct kiocb *, struct iov_iter *, 
loff_t);
+extern ssize_t generic_file_read_iter(struct kiocb *, struct iov_iter *);
 extern ssize_t __generic_file_aio_write(struct kiocb *, const struct iovec *, 
unsigned long,
                loff_t *);
 extern ssize_t __generic_file_write_iter(struct kiocb *, struct iov_iter *, 
loff_t *);
 extern ssize_t generic_file_aio_write(struct kiocb *, const struct iovec *, 
unsigned long, loff_t);
-extern ssize_t generic_file_write_iter(struct kiocb *, struct iov_iter *, 
loff_t);
+extern ssize_t generic_file_write_iter(struct kiocb *, struct iov_iter *);
 extern ssize_t generic_file_direct_write(struct kiocb *iocb, struct iov_iter 
*iter,
                loff_t pos, loff_t *ppos, size_t count);
 extern ssize_t generic_file_direct_write_iter(struct kiocb *, struct iov_iter 
*,
diff --git a/mm/filemap.c b/mm/filemap.c
index 950d92b6059b..e0f7e5c73f80 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -2006,16 +2006,14 @@ static int file_read_iter_actor(read_descriptor_t 
*desc, struct page *page,
  * generic_file_read_iter - generic filesystem read routine
  * @iocb:      kernel I/O control block
  * @iov_iter:  memory vector
- * @pos:       current file position
  */
 ssize_t
-generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter, loff_t pos)
+generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
 {
        struct file *filp = iocb->ki_filp;
        read_descriptor_t desc;
        ssize_t retval = 0;
        size_t count = iov_iter_count(iter);
-       loff_t *ppos = &iocb->ki_pos;
 
        if (io_is_direct(filp)) {
                loff_t size;
@@ -2027,14 +2025,15 @@ generic_file_read_iter(struct kiocb *iocb, struct 
iov_iter *iter, loff_t pos)
                if (!count)
                        goto out; /* skip atime */
                size = i_size_read(inode);
-               retval = filemap_write_and_wait_range(mapping, pos,
-                               pos + count - 1);
+               retval = filemap_write_and_wait_range(mapping, iocb->ki_pos,
+                               iocb->ki_pos + count - 1);
                if (!retval) {
                        struct iov_iter data = *iter;
-                       retval = mapping->a_ops->direct_IO(READ, iocb, &data, 
pos);
+                       retval = mapping->a_ops->direct_IO(READ, iocb, &data,
+                                                          iocb->ki_pos);
                }
                if (retval > 0) {
-                       *ppos = pos + retval;
+                       iocb->ki_pos += retval;
                        count -= retval;
                }
 
@@ -2046,7 +2045,7 @@ generic_file_read_iter(struct kiocb *iocb, struct 
iov_iter *iter, loff_t pos)
                 * and return.  Otherwise fallthrough to buffered io for
                 * the rest of the read.
                 */
-               if (retval < 0 || !count || *ppos >= size) {
+               if (retval < 0 || !count || iocb->ki_pos >= size) {
                        file_accessed(filp);
                        goto out;
                }
@@ -2067,7 +2066,7 @@ generic_file_read_iter(struct kiocb *iocb, struct 
iov_iter *iter, loff_t pos)
        desc.arg.data = iter;
        desc.count = count;
        desc.error = 0;
-       do_generic_file_read(filp, ppos, &desc, file_read_iter_actor);
+       do_generic_file_read(filp, &iocb->ki_pos, &desc, file_read_iter_actor);
 
        retval += desc.written;
        if (desc.error && !retval)
@@ -2096,7 +2095,8 @@ generic_file_aio_read(struct kiocb *iocb, const struct 
iovec *iov,
 
        iov_iter_init(&iter, iov, nr_segs, count, 0);
 
-       return generic_file_read_iter(iocb, &iter, pos);
+       BUG_ON(iocb->ki_pos != pos);
+       return generic_file_read_iter(iocb, &iter);
 }
 EXPORT_SYMBOL(generic_file_aio_read);
 
@@ -3097,12 +3097,12 @@ ssize_t __generic_file_write_iter(struct kiocb *iocb, 
struct iov_iter *iter,
 }
 EXPORT_SYMBOL(__generic_file_write_iter);
 
-ssize_t generic_file_write_iter(struct kiocb *iocb, struct iov_iter *iter,
-                               loff_t pos)
+ssize_t generic_file_write_iter(struct kiocb *iocb, struct iov_iter *iter)
 {
        struct file *file = iocb->ki_filp;
        struct inode *inode = file->f_mapping->host;
        ssize_t ret;
+       loff_t pos = iocb->ki_pos;
 
        mutex_lock(&inode->i_mutex);
        ret = __generic_file_write_iter(iocb, iter, &iocb->ki_pos);
-- 
2.24.3

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to