aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-04-15 16:22:56 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2015-04-15 16:22:56 -0400
commitfa927894bbb4a4c7669c72bad1924991022fda38 (patch)
tree93560f1a096973235fe9ff50c436f5239c1c499a
parentc841e12add6926d64aa608687893465330b5a03e (diff)
parent8436318205b9f29e45db88850ec60e326327e241 (diff)
Merge branch 'for-linus-2' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull second vfs update from Al Viro: "Now that net-next went in... Here's the next big chunk - killing ->aio_read() and ->aio_write(). There'll be one more pile today (direct_IO changes and generic_write_checks() cleanups/fixes), but I'd prefer to keep that one separate" * 'for-linus-2' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (37 commits) ->aio_read and ->aio_write removed pcm: another weird API abuse infinibad: weird APIs switched to ->write_iter() kill do_sync_read/do_sync_write fuse: use iov_iter_get_pages() for non-splice path fuse: switch to ->read_iter/->write_iter switch drivers/char/mem.c to ->read_iter/->write_iter make new_sync_{read,write}() static coredump: accept any write method switch /dev/loop to vfs_iter_write() serial2002: switch to __vfs_read/__vfs_write ashmem: use __vfs_read() export __vfs_read() autofs: switch to __vfs_write() new helper: __vfs_write() switch hugetlbfs to ->read_iter() coda: switch to ->read_iter/->write_iter ncpfs: switch to ->read_iter/->write_iter net/9p: remove (now-)unused helpers p9_client_attach(): set fid->uid correctly ...
-rw-r--r--Documentation/filesystems/Locking2
-rw-r--r--Documentation/filesystems/porting12
-rw-r--r--Documentation/filesystems/vfs.txt6
-rw-r--r--arch/s390/hypfs/inode.c2
-rw-r--r--drivers/block/loop.c12
-rw-r--r--drivers/char/mem.c20
-rw-r--r--drivers/char/raw.c2
-rw-r--r--drivers/infiniband/hw/ipath/ipath_file_ops.c18
-rw-r--r--drivers/infiniband/hw/qib/qib_file_ops.c20
-rw-r--r--drivers/net/macvtap.c2
-rw-r--r--drivers/net/tun.c2
-rw-r--r--drivers/staging/android/ashmem.c2
-rw-r--r--drivers/staging/comedi/drivers/serial2002.c18
-rw-r--r--drivers/staging/lustre/lustre/llite/file.c6
-rw-r--r--drivers/staging/lustre/lustre/llite/llite_internal.h2
-rw-r--r--drivers/usb/gadget/function/f_fs.c2
-rw-r--r--drivers/usb/gadget/legacy/inode.c2
-rw-r--r--fs/9p/v9fs_vfs.h4
-rw-r--r--fs/9p/vfs_addr.c80
-rw-r--r--fs/9p/vfs_dir.c15
-rw-r--r--fs/9p/vfs_file.c314
-rw-r--r--fs/9p/xattr.c80
-rw-r--r--fs/adfs/file.c2
-rw-r--r--fs/affs/file.c2
-rw-r--r--fs/afs/file.c2
-rw-r--r--fs/aio.c23
-rw-r--r--fs/autofs4/autofs_i.h2
-rw-r--r--fs/autofs4/waitq.c2
-rw-r--r--fs/bfs/file.c2
-rw-r--r--fs/block_dev.c2
-rw-r--r--fs/btrfs/file.c2
-rw-r--r--fs/ceph/file.c2
-rw-r--r--fs/cifs/cifsfs.c12
-rw-r--r--fs/coda/file.c38
-rw-r--r--fs/coredump.c2
-rw-r--r--fs/ecryptfs/file.c2
-rw-r--r--fs/exofs/file.c2
-rw-r--r--fs/ext2/file.c4
-rw-r--r--fs/ext3/file.c2
-rw-r--r--fs/ext4/file.c4
-rw-r--r--fs/f2fs/file.c2
-rw-r--r--fs/fat/file.c2
-rw-r--r--fs/file_table.c4
-rw-r--r--fs/fuse/cuse.c25
-rw-r--r--fs/fuse/dev.c63
-rw-r--r--fs/fuse/file.c69
-rw-r--r--fs/gfs2/file.c4
-rw-r--r--fs/hfs/inode.c2
-rw-r--r--fs/hfsplus/inode.c2
-rw-r--r--fs/hostfs/hostfs_kern.c2
-rw-r--r--fs/hpfs/file.c2
-rw-r--r--fs/hugetlbfs/inode.c91
-rw-r--r--fs/jffs2/file.c2
-rw-r--r--fs/jfs/file.c2
-rw-r--r--fs/logfs/file.c2
-rw-r--r--fs/minix/file.c2
-rw-r--r--fs/ncpfs/file.c90
-rw-r--r--fs/ncpfs/ncplib_kernel.c6
-rw-r--r--fs/ncpfs/ncplib_kernel.h2
-rw-r--r--fs/nfs/file.c2
-rw-r--r--fs/nfs/nfs4file.c2
-rw-r--r--fs/nilfs2/file.c2
-rw-r--r--fs/ntfs/file.c2
-rw-r--r--fs/ocfs2/file.c4
-rw-r--r--fs/omfs/file.c2
-rw-r--r--fs/open.c4
-rw-r--r--fs/pipe.c2
-rw-r--r--fs/ramfs/file-mmu.c2
-rw-r--r--fs/ramfs/file-nommu.c2
-rw-r--r--fs/read_write.c109
-rw-r--r--fs/reiserfs/file.c2
-rw-r--r--fs/romfs/mmap-nommu.c1
-rw-r--r--fs/sysv/file.c2
-rw-r--r--fs/ubifs/file.c2
-rw-r--r--fs/udf/file.c2
-rw-r--r--fs/ufs/file.c2
-rw-r--r--fs/xfs/xfs_file.c2
-rw-r--r--include/linux/fs.h7
-rw-r--r--include/net/9p/client.h8
-rw-r--r--include/net/9p/transport.h2
-rw-r--r--kernel/acct.c2
-rw-r--r--mm/nommu.c4
-rw-r--r--mm/shmem.c2
-rw-r--r--net/9p/client.c262
-rw-r--r--net/9p/protocol.c24
-rw-r--r--net/9p/trans_common.c42
-rw-r--r--net/9p/trans_common.h2
-rw-r--r--net/9p/trans_virtio.c137
-rw-r--r--net/socket.c2
-rw-r--r--sound/core/pcm_native.c39
90 files changed, 598 insertions, 1185 deletions
diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking
index f91926f2f482..c3cd6279e92e 100644
--- a/Documentation/filesystems/Locking
+++ b/Documentation/filesystems/Locking
@@ -429,8 +429,6 @@ prototypes:
429 loff_t (*llseek) (struct file *, loff_t, int); 429 loff_t (*llseek) (struct file *, loff_t, int);
430 ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); 430 ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
431 ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); 431 ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
432 ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
433 ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
434 ssize_t (*read_iter) (struct kiocb *, struct iov_iter *); 432 ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);
435 ssize_t (*write_iter) (struct kiocb *, struct iov_iter *); 433 ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);
436 int (*iterate) (struct file *, struct dir_context *); 434 int (*iterate) (struct file *, struct dir_context *);
diff --git a/Documentation/filesystems/porting b/Documentation/filesystems/porting
index fa2db081505e..e69274de8d0c 100644
--- a/Documentation/filesystems/porting
+++ b/Documentation/filesystems/porting
@@ -471,3 +471,15 @@ in your dentry operations instead.
471[mandatory] 471[mandatory]
472 f_dentry is gone; use f_path.dentry, or, better yet, see if you can avoid 472 f_dentry is gone; use f_path.dentry, or, better yet, see if you can avoid
473 it entirely. 473 it entirely.
474--
475[mandatory]
476 never call ->read() and ->write() directly; use __vfs_{read,write} or
477 wrappers; instead of checking for ->write or ->read being NULL, look for
478 FMODE_CAN_{WRITE,READ} in file->f_mode.
479--
480[mandatory]
481 do _not_ use new_sync_{read,write} for ->read/->write; leave it NULL
482 instead.
483--
484[mandatory]
485 ->aio_read/->aio_write are gone. Use ->read_iter/->write_iter.
diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt
index 966b22829f3b..207cdca68bed 100644
--- a/Documentation/filesystems/vfs.txt
+++ b/Documentation/filesystems/vfs.txt
@@ -804,8 +804,6 @@ struct file_operations {
804 loff_t (*llseek) (struct file *, loff_t, int); 804 loff_t (*llseek) (struct file *, loff_t, int);
805 ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); 805 ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
806 ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); 806 ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
807 ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
808 ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
809 ssize_t (*read_iter) (struct kiocb *, struct iov_iter *); 807 ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);
810 ssize_t (*write_iter) (struct kiocb *, struct iov_iter *); 808 ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);
811 int (*iterate) (struct file *, struct dir_context *); 809 int (*iterate) (struct file *, struct dir_context *);
@@ -838,14 +836,10 @@ otherwise noted.
838 836
839 read: called by read(2) and related system calls 837 read: called by read(2) and related system calls
840 838
841 aio_read: vectored, possibly asynchronous read
842
843 read_iter: possibly asynchronous read with iov_iter as destination 839 read_iter: possibly asynchronous read with iov_iter as destination
844 840
845 write: called by write(2) and related system calls 841 write: called by write(2) and related system calls
846 842
847 aio_write: vectored, possibly asynchronous write
848
849 write_iter: possibly asynchronous write with iov_iter as source 843 write_iter: possibly asynchronous write with iov_iter as source
850 844
851 iterate: called when the VFS needs to read the directory contents 845 iterate: called when the VFS needs to read the directory contents
diff --git a/arch/s390/hypfs/inode.c b/arch/s390/hypfs/inode.c
index df7d8cbee377..3f5c799b7fb5 100644
--- a/arch/s390/hypfs/inode.c
+++ b/arch/s390/hypfs/inode.c
@@ -437,8 +437,6 @@ struct dentry *hypfs_create_str(struct dentry *dir,
437static const struct file_operations hypfs_file_ops = { 437static const struct file_operations hypfs_file_ops = {
438 .open = hypfs_open, 438 .open = hypfs_open,
439 .release = hypfs_release, 439 .release = hypfs_release,
440 .read = new_sync_read,
441 .write = new_sync_write,
442 .read_iter = hypfs_read_iter, 440 .read_iter = hypfs_read_iter,
443 .write_iter = hypfs_write_iter, 441 .write_iter = hypfs_write_iter,
444 .llseek = no_llseek, 442 .llseek = no_llseek,
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index d1f168b73634..c4fd1e45ce1e 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -75,6 +75,7 @@
75#include <linux/sysfs.h> 75#include <linux/sysfs.h>
76#include <linux/miscdevice.h> 76#include <linux/miscdevice.h>
77#include <linux/falloc.h> 77#include <linux/falloc.h>
78#include <linux/uio.h>
78#include "loop.h" 79#include "loop.h"
79 80
80#include <asm/uaccess.h> 81#include <asm/uaccess.h>
@@ -229,13 +230,14 @@ lo_do_transfer(struct loop_device *lo, int cmd,
229static int __do_lo_send_write(struct file *file, 230static int __do_lo_send_write(struct file *file,
230 u8 *buf, const int len, loff_t pos) 231 u8 *buf, const int len, loff_t pos)
231{ 232{
233 struct kvec kvec = {.iov_base = buf, .iov_len = len};
234 struct iov_iter from;
232 ssize_t bw; 235 ssize_t bw;
233 mm_segment_t old_fs = get_fs(); 236
237 iov_iter_kvec(&from, ITER_KVEC | WRITE, &kvec, 1, len);
234 238
235 file_start_write(file); 239 file_start_write(file);
236 set_fs(get_ds()); 240 bw = vfs_iter_write(file, &from, &pos);
237 bw = file->f_op->write(file, buf, len, &pos);
238 set_fs(old_fs);
239 file_end_write(file); 241 file_end_write(file);
240 if (likely(bw == len)) 242 if (likely(bw == len))
241 return 0; 243 return 0;
@@ -767,7 +769,7 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode,
767 goto out_putf; 769 goto out_putf;
768 770
769 if (!(file->f_mode & FMODE_WRITE) || !(mode & FMODE_WRITE) || 771 if (!(file->f_mode & FMODE_WRITE) || !(mode & FMODE_WRITE) ||
770 !file->f_op->write) 772 !file->f_op->write_iter)
771 lo_flags |= LO_FLAGS_READ_ONLY; 773 lo_flags |= LO_FLAGS_READ_ONLY;
772 774
773 lo_blocksize = S_ISBLK(inode->i_mode) ? 775 lo_blocksize = S_ISBLK(inode->i_mode) ?
diff --git a/drivers/char/mem.c b/drivers/char/mem.c
index 9c4fd7a8e2e5..6b1721f978c2 100644
--- a/drivers/char/mem.c
+++ b/drivers/char/mem.c
@@ -607,16 +607,16 @@ static ssize_t write_null(struct file *file, const char __user *buf,
607 return count; 607 return count;
608} 608}
609 609
610static ssize_t aio_read_null(struct kiocb *iocb, const struct iovec *iov, 610static ssize_t read_iter_null(struct kiocb *iocb, struct iov_iter *to)
611 unsigned long nr_segs, loff_t pos)
612{ 611{
613 return 0; 612 return 0;
614} 613}
615 614
616static ssize_t aio_write_null(struct kiocb *iocb, const struct iovec *iov, 615static ssize_t write_iter_null(struct kiocb *iocb, struct iov_iter *from)
617 unsigned long nr_segs, loff_t pos)
618{ 616{
619 return iov_length(iov, nr_segs); 617 size_t count = iov_iter_count(from);
618 iov_iter_advance(from, count);
619 return count;
620} 620}
621 621
622static int pipe_to_null(struct pipe_inode_info *info, struct pipe_buffer *buf, 622static int pipe_to_null(struct pipe_inode_info *info, struct pipe_buffer *buf,
@@ -718,7 +718,7 @@ static int open_port(struct inode *inode, struct file *filp)
718#define zero_lseek null_lseek 718#define zero_lseek null_lseek
719#define full_lseek null_lseek 719#define full_lseek null_lseek
720#define write_zero write_null 720#define write_zero write_null
721#define aio_write_zero aio_write_null 721#define write_iter_zero write_iter_null
722#define open_mem open_port 722#define open_mem open_port
723#define open_kmem open_mem 723#define open_kmem open_mem
724 724
@@ -750,8 +750,8 @@ static const struct file_operations null_fops = {
750 .llseek = null_lseek, 750 .llseek = null_lseek,
751 .read = read_null, 751 .read = read_null,
752 .write = write_null, 752 .write = write_null,
753 .aio_read = aio_read_null, 753 .read_iter = read_iter_null,
754 .aio_write = aio_write_null, 754 .write_iter = write_iter_null,
755 .splice_write = splice_write_null, 755 .splice_write = splice_write_null,
756}; 756};
757 757
@@ -764,10 +764,9 @@ static const struct file_operations __maybe_unused port_fops = {
764 764
765static const struct file_operations zero_fops = { 765static const struct file_operations zero_fops = {
766 .llseek = zero_lseek, 766 .llseek = zero_lseek,
767 .read = new_sync_read,
768 .write = write_zero, 767 .write = write_zero,
769 .read_iter = read_iter_zero, 768 .read_iter = read_iter_zero,
770 .aio_write = aio_write_zero, 769 .write_iter = write_iter_zero,
771 .mmap = mmap_zero, 770 .mmap = mmap_zero,
772#ifndef CONFIG_MMU 771#ifndef CONFIG_MMU
773 .mmap_capabilities = zero_mmap_capabilities, 772 .mmap_capabilities = zero_mmap_capabilities,
@@ -776,7 +775,6 @@ static const struct file_operations zero_fops = {
776 775
777static const struct file_operations full_fops = { 776static const struct file_operations full_fops = {
778 .llseek = full_lseek, 777 .llseek = full_lseek,
779 .read = new_sync_read,
780 .read_iter = read_iter_zero, 778 .read_iter = read_iter_zero,
781 .write = write_full, 779 .write = write_full,
782}; 780};
diff --git a/drivers/char/raw.c b/drivers/char/raw.c
index 6e29bf2db536..5fc291c6157e 100644
--- a/drivers/char/raw.c
+++ b/drivers/char/raw.c
@@ -282,9 +282,7 @@ static long raw_ctl_compat_ioctl(struct file *file, unsigned int cmd,
282#endif 282#endif
283 283
284static const struct file_operations raw_fops = { 284static const struct file_operations raw_fops = {
285 .read = new_sync_read,
286 .read_iter = blkdev_read_iter, 285 .read_iter = blkdev_read_iter,
287 .write = new_sync_write,
288 .write_iter = blkdev_write_iter, 286 .write_iter = blkdev_write_iter,
289 .fsync = blkdev_fsync, 287 .fsync = blkdev_fsync,
290 .open = raw_open, 288 .open = raw_open,
diff --git a/drivers/infiniband/hw/ipath/ipath_file_ops.c b/drivers/infiniband/hw/ipath/ipath_file_ops.c
index aed8afee56da..450d15965005 100644
--- a/drivers/infiniband/hw/ipath/ipath_file_ops.c
+++ b/drivers/infiniband/hw/ipath/ipath_file_ops.c
@@ -42,6 +42,7 @@
42#include <linux/io.h> 42#include <linux/io.h>
43#include <linux/jiffies.h> 43#include <linux/jiffies.h>
44#include <linux/cpu.h> 44#include <linux/cpu.h>
45#include <linux/uio.h>
45#include <asm/pgtable.h> 46#include <asm/pgtable.h>
46 47
47#include "ipath_kernel.h" 48#include "ipath_kernel.h"
@@ -52,15 +53,19 @@ static int ipath_open(struct inode *, struct file *);
52static int ipath_close(struct inode *, struct file *); 53static int ipath_close(struct inode *, struct file *);
53static ssize_t ipath_write(struct file *, const char __user *, size_t, 54static ssize_t ipath_write(struct file *, const char __user *, size_t,
54 loff_t *); 55 loff_t *);
55static ssize_t ipath_writev(struct kiocb *, const struct iovec *, 56static ssize_t ipath_write_iter(struct kiocb *, struct iov_iter *from);
56 unsigned long , loff_t);
57static unsigned int ipath_poll(struct file *, struct poll_table_struct *); 57static unsigned int ipath_poll(struct file *, struct poll_table_struct *);
58static int ipath_mmap(struct file *, struct vm_area_struct *); 58static int ipath_mmap(struct file *, struct vm_area_struct *);
59 59
60/*
61 * This is really, really weird shit - write() and writev() here
62 * have completely unrelated semantics. Sucky userland ABI,
63 * film at 11.
64 */
60static const struct file_operations ipath_file_ops = { 65static const struct file_operations ipath_file_ops = {
61 .owner = THIS_MODULE, 66 .owner = THIS_MODULE,
62 .write = ipath_write, 67 .write = ipath_write,
63 .aio_write = ipath_writev, 68 .write_iter = ipath_write_iter,
64 .open = ipath_open, 69 .open = ipath_open,
65 .release = ipath_close, 70 .release = ipath_close,
66 .poll = ipath_poll, 71 .poll = ipath_poll,
@@ -2413,18 +2418,17 @@ bail:
2413 return ret; 2418 return ret;
2414} 2419}
2415 2420
2416static ssize_t ipath_writev(struct kiocb *iocb, const struct iovec *iov, 2421static ssize_t ipath_write_iter(struct kiocb *iocb, struct iov_iter *from)
2417 unsigned long dim, loff_t off)
2418{ 2422{
2419 struct file *filp = iocb->ki_filp; 2423 struct file *filp = iocb->ki_filp;
2420 struct ipath_filedata *fp = filp->private_data; 2424 struct ipath_filedata *fp = filp->private_data;
2421 struct ipath_portdata *pd = port_fp(filp); 2425 struct ipath_portdata *pd = port_fp(filp);
2422 struct ipath_user_sdma_queue *pq = fp->pq; 2426 struct ipath_user_sdma_queue *pq = fp->pq;
2423 2427
2424 if (!dim) 2428 if (!iter_is_iovec(from) || !from->nr_segs)
2425 return -EINVAL; 2429 return -EINVAL;
2426 2430
2427 return ipath_user_sdma_writev(pd->port_dd, pq, iov, dim); 2431 return ipath_user_sdma_writev(pd->port_dd, pq, from->iov, from->nr_segs);
2428} 2432}
2429 2433
2430static struct class *ipath_class; 2434static struct class *ipath_class;
diff --git a/drivers/infiniband/hw/qib/qib_file_ops.c b/drivers/infiniband/hw/qib/qib_file_ops.c
index 14046f5a37fa..9ea6c440a00c 100644
--- a/drivers/infiniband/hw/qib/qib_file_ops.c
+++ b/drivers/infiniband/hw/qib/qib_file_ops.c
@@ -43,6 +43,7 @@
43#include <asm/pgtable.h> 43#include <asm/pgtable.h>
44#include <linux/delay.h> 44#include <linux/delay.h>
45#include <linux/export.h> 45#include <linux/export.h>
46#include <linux/uio.h>
46 47
47#include "qib.h" 48#include "qib.h"
48#include "qib_common.h" 49#include "qib_common.h"
@@ -54,15 +55,19 @@
54static int qib_open(struct inode *, struct file *); 55static int qib_open(struct inode *, struct file *);
55static int qib_close(struct inode *, struct file *); 56static int qib_close(struct inode *, struct file *);
56static ssize_t qib_write(struct file *, const char __user *, size_t, loff_t *); 57static ssize_t qib_write(struct file *, const char __user *, size_t, loff_t *);
57static ssize_t qib_aio_write(struct kiocb *, const struct iovec *, 58static ssize_t qib_write_iter(struct kiocb *, struct iov_iter *);
58 unsigned long, loff_t);
59static unsigned int qib_poll(struct file *, struct poll_table_struct *); 59static unsigned int qib_poll(struct file *, struct poll_table_struct *);
60static int qib_mmapf(struct file *, struct vm_area_struct *); 60static int qib_mmapf(struct file *, struct vm_area_struct *);
61 61
62/*
63 * This is really, really weird shit - write() and writev() here
64 * have completely unrelated semantics. Sucky userland ABI,
65 * film at 11.
66 */
62static const struct file_operations qib_file_ops = { 67static const struct file_operations qib_file_ops = {
63 .owner = THIS_MODULE, 68 .owner = THIS_MODULE,
64 .write = qib_write, 69 .write = qib_write,
65 .aio_write = qib_aio_write, 70 .write_iter = qib_write_iter,
66 .open = qib_open, 71 .open = qib_open,
67 .release = qib_close, 72 .release = qib_close,
68 .poll = qib_poll, 73 .poll = qib_poll,
@@ -2248,17 +2253,16 @@ bail:
2248 return ret; 2253 return ret;
2249} 2254}
2250 2255
2251static ssize_t qib_aio_write(struct kiocb *iocb, const struct iovec *iov, 2256static ssize_t qib_write_iter(struct kiocb *iocb, struct iov_iter *from)
2252 unsigned long dim, loff_t off)
2253{ 2257{
2254 struct qib_filedata *fp = iocb->ki_filp->private_data; 2258 struct qib_filedata *fp = iocb->ki_filp->private_data;
2255 struct qib_ctxtdata *rcd = ctxt_fp(iocb->ki_filp); 2259 struct qib_ctxtdata *rcd = ctxt_fp(iocb->ki_filp);
2256 struct qib_user_sdma_queue *pq = fp->pq; 2260 struct qib_user_sdma_queue *pq = fp->pq;
2257 2261
2258 if (!dim || !pq) 2262 if (!iter_is_iovec(from) || !from->nr_segs || !pq)
2259 return -EINVAL; 2263 return -EINVAL;
2260 2264
2261 return qib_user_sdma_writev(rcd, pq, iov, dim); 2265 return qib_user_sdma_writev(rcd, pq, from->iov, from->nr_segs);
2262} 2266}
2263 2267
2264static struct class *qib_class; 2268static struct class *qib_class;
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c
index 8362aef0c15e..9c91ff872485 100644
--- a/drivers/net/macvtap.c
+++ b/drivers/net/macvtap.c
@@ -1118,8 +1118,6 @@ static const struct file_operations macvtap_fops = {
1118 .owner = THIS_MODULE, 1118 .owner = THIS_MODULE,
1119 .open = macvtap_open, 1119 .open = macvtap_open,
1120 .release = macvtap_release, 1120 .release = macvtap_release,
1121 .read = new_sync_read,
1122 .write = new_sync_write,
1123 .read_iter = macvtap_read_iter, 1121 .read_iter = macvtap_read_iter,
1124 .write_iter = macvtap_write_iter, 1122 .write_iter = macvtap_write_iter,
1125 .poll = macvtap_poll, 1123 .poll = macvtap_poll,
diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index b96b94cee760..e470ae59d405 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -2223,8 +2223,6 @@ static void tun_chr_show_fdinfo(struct seq_file *m, struct file *f)
2223static const struct file_operations tun_fops = { 2223static const struct file_operations tun_fops = {
2224 .owner = THIS_MODULE, 2224 .owner = THIS_MODULE,
2225 .llseek = no_llseek, 2225 .llseek = no_llseek,
2226 .read = new_sync_read,
2227 .write = new_sync_write,
2228 .read_iter = tun_chr_read_iter, 2226 .read_iter = tun_chr_read_iter,
2229 .write_iter = tun_chr_write_iter, 2227 .write_iter = tun_chr_write_iter,
2230 .poll = tun_chr_poll, 2228 .poll = tun_chr_poll,
diff --git a/drivers/staging/android/ashmem.c b/drivers/staging/android/ashmem.c
index d140b733940c..c5c037ccf32c 100644
--- a/drivers/staging/android/ashmem.c
+++ b/drivers/staging/android/ashmem.c
@@ -310,7 +310,7 @@ static ssize_t ashmem_read(struct file *file, char __user *buf,
310 * be destroyed until all references to the file are dropped and 310 * be destroyed until all references to the file are dropped and
311 * ashmem_release is called. 311 * ashmem_release is called.
312 */ 312 */
313 ret = asma->file->f_op->read(asma->file, buf, len, pos); 313 ret = __vfs_read(asma->file, buf, len, pos);
314 if (ret >= 0) { 314 if (ret >= 0) {
315 /** Update backing file pos, since f_ops->read() doesn't */ 315 /** Update backing file pos, since f_ops->read() doesn't */
316 asma->file->f_pos = *pos; 316 asma->file->f_pos = *pos;
diff --git a/drivers/staging/comedi/drivers/serial2002.c b/drivers/staging/comedi/drivers/serial2002.c
index ad35ed6e93f0..304ebff119ee 100644
--- a/drivers/staging/comedi/drivers/serial2002.c
+++ b/drivers/staging/comedi/drivers/serial2002.c
@@ -108,24 +108,16 @@ static int serial2002_tty_write(struct file *f, unsigned char *buf, int count)
108{ 108{
109 const char __user *p = (__force const char __user *)buf; 109 const char __user *p = (__force const char __user *)buf;
110 int result; 110 int result;
111 loff_t offset = 0;
111 mm_segment_t oldfs; 112 mm_segment_t oldfs;
112 113
113 oldfs = get_fs(); 114 oldfs = get_fs();
114 set_fs(KERNEL_DS); 115 set_fs(KERNEL_DS);
115 f->f_pos = 0; 116 result = __vfs_write(f, p, count, &offset);
116 result = f->f_op->write(f, p, count, &f->f_pos);
117 set_fs(oldfs); 117 set_fs(oldfs);
118 return result; 118 return result;
119} 119}
120 120
121static int serial2002_tty_readb(struct file *f, unsigned char *buf)
122{
123 char __user *p = (__force char __user *)buf;
124
125 f->f_pos = 0;
126 return f->f_op->read(f, p, 1, &f->f_pos);
127}
128
129static void serial2002_tty_read_poll_wait(struct file *f, int timeout) 121static void serial2002_tty_read_poll_wait(struct file *f, int timeout)
130{ 122{
131 struct poll_wqueues table; 123 struct poll_wqueues table;
@@ -161,13 +153,15 @@ static int serial2002_tty_read(struct file *f, int timeout)
161 result = -1; 153 result = -1;
162 if (!IS_ERR(f)) { 154 if (!IS_ERR(f)) {
163 mm_segment_t oldfs; 155 mm_segment_t oldfs;
156 char __user *p = (__force char __user *)&ch;
157 loff_t offset = 0;
164 158
165 oldfs = get_fs(); 159 oldfs = get_fs();
166 set_fs(KERNEL_DS); 160 set_fs(KERNEL_DS);
167 if (f->f_op->poll) { 161 if (f->f_op->poll) {
168 serial2002_tty_read_poll_wait(f, timeout); 162 serial2002_tty_read_poll_wait(f, timeout);
169 163
170 if (serial2002_tty_readb(f, &ch) == 1) 164 if (__vfs_read(f, p, 1, &offset) == 1)
171 result = ch; 165 result = ch;
172 } else { 166 } else {
173 /* Device does not support poll, busy wait */ 167 /* Device does not support poll, busy wait */
@@ -178,7 +172,7 @@ static int serial2002_tty_read(struct file *f, int timeout)
178 if (retries >= timeout) 172 if (retries >= timeout)
179 break; 173 break;
180 174
181 if (serial2002_tty_readb(f, &ch) == 1) { 175 if (__vfs_read(f, p, 1, &offset) == 1) {
182 result = ch; 176 result = ch;
183 break; 177 break;
184 } 178 }
diff --git a/drivers/staging/lustre/lustre/llite/file.c b/drivers/staging/lustre/lustre/llite/file.c
index 85e74d18d1c7..529062ea112b 100644
--- a/drivers/staging/lustre/lustre/llite/file.c
+++ b/drivers/staging/lustre/lustre/llite/file.c
@@ -3135,9 +3135,7 @@ int ll_inode_permission(struct inode *inode, int mask)
3135 3135
3136/* -o localflock - only provides locally consistent flock locks */ 3136/* -o localflock - only provides locally consistent flock locks */
3137struct file_operations ll_file_operations = { 3137struct file_operations ll_file_operations = {
3138 .read = new_sync_read,
3139 .read_iter = ll_file_read_iter, 3138 .read_iter = ll_file_read_iter,
3140 .write = new_sync_write,
3141 .write_iter = ll_file_write_iter, 3139 .write_iter = ll_file_write_iter,
3142 .unlocked_ioctl = ll_file_ioctl, 3140 .unlocked_ioctl = ll_file_ioctl,
3143 .open = ll_file_open, 3141 .open = ll_file_open,
@@ -3150,9 +3148,7 @@ struct file_operations ll_file_operations = {
3150}; 3148};
3151 3149
3152struct file_operations ll_file_operations_flock = { 3150struct file_operations ll_file_operations_flock = {
3153 .read = new_sync_read,
3154 .read_iter = ll_file_read_iter, 3151 .read_iter = ll_file_read_iter,
3155 .write = new_sync_write,
3156 .write_iter = ll_file_write_iter, 3152 .write_iter = ll_file_write_iter,
3157 .unlocked_ioctl = ll_file_ioctl, 3153 .unlocked_ioctl = ll_file_ioctl,
3158 .open = ll_file_open, 3154 .open = ll_file_open,
@@ -3168,9 +3164,7 @@ struct file_operations ll_file_operations_flock = {
3168 3164
3169/* These are for -o noflock - to return ENOSYS on flock calls */ 3165/* These are for -o noflock - to return ENOSYS on flock calls */
3170struct file_operations ll_file_operations_noflock = { 3166struct file_operations ll_file_operations_noflock = {
3171 .read = new_sync_read,
3172 .read_iter = ll_file_read_iter, 3167 .read_iter = ll_file_read_iter,
3173 .write = new_sync_write,
3174 .write_iter = ll_file_write_iter, 3168 .write_iter = ll_file_write_iter,
3175 .unlocked_ioctl = ll_file_ioctl, 3169 .unlocked_ioctl = ll_file_ioctl,
3176 .open = ll_file_open, 3170 .open = ll_file_open,
diff --git a/drivers/staging/lustre/lustre/llite/llite_internal.h b/drivers/staging/lustre/lustre/llite/llite_internal.h
index 2af1d7286250..e7422f5c9c6f 100644
--- a/drivers/staging/lustre/lustre/llite/llite_internal.h
+++ b/drivers/staging/lustre/lustre/llite/llite_internal.h
@@ -938,10 +938,8 @@ struct ll_cl_context {
938}; 938};
939 939
940struct vvp_thread_info { 940struct vvp_thread_info {
941 struct iovec vti_local_iov;
942 struct vvp_io_args vti_args; 941 struct vvp_io_args vti_args;
943 struct ra_io_arg vti_ria; 942 struct ra_io_arg vti_ria;
944 struct kiocb vti_kiocb;
945 struct ll_cl_context vti_io_ctx; 943 struct ll_cl_context vti_io_ctx;
946}; 944};
947 945
diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c
index a12315a78248..6bdb57069044 100644
--- a/drivers/usb/gadget/function/f_fs.c
+++ b/drivers/usb/gadget/function/f_fs.c
@@ -1061,8 +1061,6 @@ static const struct file_operations ffs_epfile_operations = {
1061 .llseek = no_llseek, 1061 .llseek = no_llseek,
1062 1062
1063 .open = ffs_epfile_open, 1063 .open = ffs_epfile_open,
1064 .write = new_sync_write,
1065 .read = new_sync_read,
1066 .write_iter = ffs_epfile_write_iter, 1064 .write_iter = ffs_epfile_write_iter,
1067 .read_iter = ffs_epfile_read_iter, 1065 .read_iter = ffs_epfile_read_iter,
1068 .release = ffs_epfile_release, 1066 .release = ffs_epfile_release,
diff --git a/drivers/usb/gadget/legacy/inode.c b/drivers/usb/gadget/legacy/inode.c
index 662ef2c1c62b..6af58c6dba5e 100644
--- a/drivers/usb/gadget/legacy/inode.c
+++ b/drivers/usb/gadget/legacy/inode.c
@@ -699,8 +699,6 @@ static const struct file_operations ep_io_operations = {
699 .open = ep_open, 699 .open = ep_open,
700 .release = ep_release, 700 .release = ep_release,
701 .llseek = no_llseek, 701 .llseek = no_llseek,
702 .read = new_sync_read,
703 .write = new_sync_write,
704 .unlocked_ioctl = ep_ioctl, 702 .unlocked_ioctl = ep_ioctl,
705 .read_iter = ep_read_iter, 703 .read_iter = ep_read_iter,
706 .write_iter = ep_write_iter, 704 .write_iter = ep_write_iter,
diff --git a/fs/9p/v9fs_vfs.h b/fs/9p/v9fs_vfs.h
index b83ebfbf3fdc..5a0db6dec8d1 100644
--- a/fs/9p/v9fs_vfs.h
+++ b/fs/9p/v9fs_vfs.h
@@ -68,14 +68,10 @@ int v9fs_file_open(struct inode *inode, struct file *file);
68void v9fs_inode2stat(struct inode *inode, struct p9_wstat *stat); 68void v9fs_inode2stat(struct inode *inode, struct p9_wstat *stat);
69int v9fs_uflags2omode(int uflags, int extended); 69int v9fs_uflags2omode(int uflags, int extended);
70 70
71ssize_t v9fs_file_readn(struct file *, char *, char __user *, u32, u64);
72ssize_t v9fs_fid_readn(struct p9_fid *, char *, char __user *, u32, u64);
73void v9fs_blank_wstat(struct p9_wstat *wstat); 71void v9fs_blank_wstat(struct p9_wstat *wstat);
74int v9fs_vfs_setattr_dotl(struct dentry *, struct iattr *); 72int v9fs_vfs_setattr_dotl(struct dentry *, struct iattr *);
75int v9fs_file_fsync_dotl(struct file *filp, loff_t start, loff_t end, 73int v9fs_file_fsync_dotl(struct file *filp, loff_t start, loff_t end,
76 int datasync); 74 int datasync);
77ssize_t v9fs_file_write_internal(struct inode *, struct p9_fid *,
78 const char __user *, size_t, loff_t *, int);
79int v9fs_refresh_inode(struct p9_fid *fid, struct inode *inode); 75int v9fs_refresh_inode(struct p9_fid *fid, struct inode *inode);
80int v9fs_refresh_inode_dotl(struct p9_fid *fid, struct inode *inode); 76int v9fs_refresh_inode_dotl(struct p9_fid *fid, struct inode *inode);
81static inline void v9fs_invalidate_inode_attr(struct inode *inode) 77static inline void v9fs_invalidate_inode_attr(struct inode *inode)
diff --git a/fs/9p/vfs_addr.c b/fs/9p/vfs_addr.c
index ff1a5bac4200..2e38f9a5b472 100644
--- a/fs/9p/vfs_addr.c
+++ b/fs/9p/vfs_addr.c
@@ -51,12 +51,11 @@
51 */ 51 */
52static int v9fs_fid_readpage(struct p9_fid *fid, struct page *page) 52static int v9fs_fid_readpage(struct p9_fid *fid, struct page *page)
53{ 53{
54 int retval; 54 struct inode *inode = page->mapping->host;
55 loff_t offset; 55 struct bio_vec bvec = {.bv_page = page, .bv_len = PAGE_SIZE};
56 char *buffer; 56 struct iov_iter to;
57 struct inode *inode; 57 int retval, err;
58 58
59 inode = page->mapping->host;
60 p9_debug(P9_DEBUG_VFS, "\n"); 59 p9_debug(P9_DEBUG_VFS, "\n");
61 60
62 BUG_ON(!PageLocked(page)); 61 BUG_ON(!PageLocked(page));
@@ -65,16 +64,16 @@ static int v9fs_fid_readpage(struct p9_fid *fid, struct page *page)
65 if (retval == 0) 64 if (retval == 0)
66 return retval; 65 return retval;
67 66
68 buffer = kmap(page); 67 iov_iter_bvec(&to, ITER_BVEC | READ, &bvec, 1, PAGE_SIZE);
69 offset = page_offset(page);
70 68
71 retval = v9fs_fid_readn(fid, buffer, NULL, PAGE_CACHE_SIZE, offset); 69 retval = p9_client_read(fid, page_offset(page), &to, &err);
72 if (retval < 0) { 70 if (err) {
73 v9fs_uncache_page(inode, page); 71 v9fs_uncache_page(inode, page);
72 retval = err;
74 goto done; 73 goto done;
75 } 74 }
76 75
77 memset(buffer + retval, 0, PAGE_CACHE_SIZE - retval); 76 zero_user(page, retval, PAGE_SIZE - retval);
78 flush_dcache_page(page); 77 flush_dcache_page(page);
79 SetPageUptodate(page); 78 SetPageUptodate(page);
80 79
@@ -82,7 +81,6 @@ static int v9fs_fid_readpage(struct p9_fid *fid, struct page *page)
82 retval = 0; 81 retval = 0;
83 82
84done: 83done:
85 kunmap(page);
86 unlock_page(page); 84 unlock_page(page);
87 return retval; 85 return retval;
88} 86}
@@ -161,41 +159,32 @@ static void v9fs_invalidate_page(struct page *page, unsigned int offset,
161 159
162static int v9fs_vfs_writepage_locked(struct page *page) 160static int v9fs_vfs_writepage_locked(struct page *page)
163{ 161{
164 char *buffer;
165 int retval, len;
166 loff_t offset, size;
167 mm_segment_t old_fs;
168 struct v9fs_inode *v9inode;
169 struct inode *inode = page->mapping->host; 162 struct inode *inode = page->mapping->host;
163 struct v9fs_inode *v9inode = V9FS_I(inode);
164 loff_t size = i_size_read(inode);
165 struct iov_iter from;
166 struct bio_vec bvec;
167 int err, len;
170 168
171 v9inode = V9FS_I(inode);
172 size = i_size_read(inode);
173 if (page->index == size >> PAGE_CACHE_SHIFT) 169 if (page->index == size >> PAGE_CACHE_SHIFT)
174 len = size & ~PAGE_CACHE_MASK; 170 len = size & ~PAGE_CACHE_MASK;
175 else 171 else
176 len = PAGE_CACHE_SIZE; 172 len = PAGE_CACHE_SIZE;
177 173
178 set_page_writeback(page); 174 bvec.bv_page = page;
179 175 bvec.bv_offset = 0;
180 buffer = kmap(page); 176 bvec.bv_len = len;
181 offset = page_offset(page); 177 iov_iter_bvec(&from, ITER_BVEC | WRITE, &bvec, 1, len);
182 178
183 old_fs = get_fs();
184 set_fs(get_ds());
185 /* We should have writeback_fid always set */ 179 /* We should have writeback_fid always set */
186 BUG_ON(!v9inode->writeback_fid); 180 BUG_ON(!v9inode->writeback_fid);
187 181
188 retval = v9fs_file_write_internal(inode, 182 set_page_writeback(page);
189 v9inode->writeback_fid, 183
190 (__force const char __user *)buffer, 184 p9_client_write(v9inode->writeback_fid, page_offset(page), &from, &err);
191 len, &offset, 0);
192 if (retval > 0)
193 retval = 0;
194 185
195 set_fs(old_fs);
196 kunmap(page);
197 end_page_writeback(page); 186 end_page_writeback(page);
198 return retval; 187 return err;
199} 188}
200 189
201static int v9fs_vfs_writepage(struct page *page, struct writeback_control *wbc) 190static int v9fs_vfs_writepage(struct page *page, struct writeback_control *wbc)
@@ -261,16 +250,21 @@ static int v9fs_launder_page(struct page *page)
261static ssize_t 250static ssize_t
262v9fs_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter, loff_t pos) 251v9fs_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter, loff_t pos)
263{ 252{
264 /* 253 struct file *file = iocb->ki_filp;
265 * FIXME 254 ssize_t n;
266 * Now that we do caching with cache mode enabled, We need 255 int err = 0;
267 * to support direct IO 256 if (rw & WRITE) {
268 */ 257 n = p9_client_write(file->private_data, pos, iter, &err);
269 p9_debug(P9_DEBUG_VFS, "v9fs_direct_IO: v9fs_direct_IO (%pD) off/no(%lld/%lu) EINVAL\n", 258 if (n) {
270 iocb->ki_filp, 259 struct inode *inode = file_inode(file);
271 (long long)pos, iter->nr_segs); 260 loff_t i_size = i_size_read(inode);
272 261 if (pos + n > i_size)
273 return -EINVAL; 262 inode_add_bytes(inode, pos + n - i_size);
263 }
264 } else {
265 n = p9_client_read(file->private_data, pos, iter, &err);
266 }
267 return n ? n : err;
274} 268}
275 269
276static int v9fs_write_begin(struct file *filp, struct address_space *mapping, 270static int v9fs_write_begin(struct file *filp, struct address_space *mapping,
diff --git a/fs/9p/vfs_dir.c b/fs/9p/vfs_dir.c
index 4f1151088ebe..76c3b1ab6361 100644
--- a/fs/9p/vfs_dir.c
+++ b/fs/9p/vfs_dir.c
@@ -33,6 +33,7 @@
33#include <linux/inet.h> 33#include <linux/inet.h>
34#include <linux/idr.h> 34#include <linux/idr.h>
35#include <linux/slab.h> 35#include <linux/slab.h>
36#include <linux/uio.h>
36#include <net/9p/9p.h> 37#include <net/9p/9p.h>
37#include <net/9p/client.h> 38#include <net/9p/client.h>
38 39
@@ -115,6 +116,7 @@ static int v9fs_dir_readdir(struct file *file, struct dir_context *ctx)
115 int buflen; 116 int buflen;
116 int reclen = 0; 117 int reclen = 0;
117 struct p9_rdir *rdir; 118 struct p9_rdir *rdir;
119 struct kvec kvec;
118 120
119 p9_debug(P9_DEBUG_VFS, "name %pD\n", file); 121 p9_debug(P9_DEBUG_VFS, "name %pD\n", file);
120 fid = file->private_data; 122 fid = file->private_data;
@@ -124,16 +126,21 @@ static int v9fs_dir_readdir(struct file *file, struct dir_context *ctx)
124 rdir = v9fs_alloc_rdir_buf(file, buflen); 126 rdir = v9fs_alloc_rdir_buf(file, buflen);
125 if (!rdir) 127 if (!rdir)
126 return -ENOMEM; 128 return -ENOMEM;
129 kvec.iov_base = rdir->buf;
130 kvec.iov_len = buflen;
127 131
128 while (1) { 132 while (1) {
129 if (rdir->tail == rdir->head) { 133 if (rdir->tail == rdir->head) {
130 err = v9fs_file_readn(file, rdir->buf, NULL, 134 struct iov_iter to;
131 buflen, ctx->pos); 135 int n;
132 if (err <= 0) 136 iov_iter_kvec(&to, READ | ITER_KVEC, &kvec, 1, buflen);
137 n = p9_client_read(file->private_data, ctx->pos, &to,
138 &err);
139 if (err)
133 return err; 140 return err;
134 141
135 rdir->head = 0; 142 rdir->head = 0;
136 rdir->tail = err; 143 rdir->tail = n;
137 } 144 }
138 while (rdir->head < rdir->tail) { 145 while (rdir->head < rdir->tail) {
139 p9stat_init(&st); 146 p9stat_init(&st);
diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c
index b40133796b87..d7fcb775311e 100644
--- a/fs/9p/vfs_file.c
+++ b/fs/9p/vfs_file.c
@@ -36,6 +36,8 @@
36#include <linux/utsname.h> 36#include <linux/utsname.h>
37#include <asm/uaccess.h> 37#include <asm/uaccess.h>
38#include <linux/idr.h> 38#include <linux/idr.h>
39#include <linux/uio.h>
40#include <linux/slab.h>
39#include <net/9p/9p.h> 41#include <net/9p/9p.h>
40#include <net/9p/client.h> 42#include <net/9p/client.h>
41 43
@@ -285,6 +287,7 @@ static int v9fs_file_getlock(struct file *filp, struct file_lock *fl)
285 fl->fl_end = glock.start + glock.length - 1; 287 fl->fl_end = glock.start + glock.length - 1;
286 fl->fl_pid = glock.proc_id; 288 fl->fl_pid = glock.proc_id;
287 } 289 }
290 kfree(glock.client_id);
288 return res; 291 return res;
289} 292}
290 293
@@ -364,63 +367,6 @@ out_err:
364} 367}
365 368
366/** 369/**
367 * v9fs_fid_readn - read from a fid
368 * @fid: fid to read
369 * @data: data buffer to read data into
370 * @udata: user data buffer to read data into
371 * @count: size of buffer
372 * @offset: offset at which to read data
373 *
374 */
375ssize_t
376v9fs_fid_readn(struct p9_fid *fid, char *data, char __user *udata, u32 count,
377 u64 offset)
378{
379 int n, total, size;
380
381 p9_debug(P9_DEBUG_VFS, "fid %d offset %llu count %d\n",
382 fid->fid, (long long unsigned)offset, count);
383 n = 0;
384 total = 0;
385 size = fid->iounit ? fid->iounit : fid->clnt->msize - P9_IOHDRSZ;
386 do {
387 n = p9_client_read(fid, data, udata, offset, count);
388 if (n <= 0)
389 break;
390
391 if (data)
392 data += n;
393 if (udata)
394 udata += n;
395
396 offset += n;
397 count -= n;
398 total += n;
399 } while (count > 0 && n == size);
400
401 if (n < 0)
402 total = n;
403
404 return total;
405}
406
407/**
408 * v9fs_file_readn - read from a file
409 * @filp: file pointer to read
410 * @data: data buffer to read data into
411 * @udata: user data buffer to read data into
412 * @count: size of buffer
413 * @offset: offset at which to read data
414 *
415 */
416ssize_t
417v9fs_file_readn(struct file *filp, char *data, char __user *udata, u32 count,
418 u64 offset)
419{
420 return v9fs_fid_readn(filp->private_data, data, udata, count, offset);
421}
422
423/**
424 * v9fs_file_read - read from a file 370 * v9fs_file_read - read from a file
425 * @filp: file pointer to read 371 * @filp: file pointer to read
426 * @udata: user data buffer to read data into 372 * @udata: user data buffer to read data into
@@ -430,69 +376,22 @@ v9fs_file_readn(struct file *filp, char *data, char __user *udata, u32 count,
430 */ 376 */
431 377
432static ssize_t 378static ssize_t
433v9fs_file_read(struct file *filp, char __user *udata, size_t count, 379v9fs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
434 loff_t * offset)
435{ 380{
436 int ret; 381 struct p9_fid *fid = iocb->ki_filp->private_data;
437 struct p9_fid *fid; 382 int ret, err;
438 size_t size;
439 383
440 p9_debug(P9_DEBUG_VFS, "count %zu offset %lld\n", count, *offset); 384 p9_debug(P9_DEBUG_VFS, "count %zu offset %lld\n",
441 fid = filp->private_data; 385 iov_iter_count(to), iocb->ki_pos);
442 386
443 size = fid->iounit ? fid->iounit : fid->clnt->msize - P9_IOHDRSZ; 387 ret = p9_client_read(fid, iocb->ki_pos, to, &err);
444 if (count > size) 388 if (!ret)
445 ret = v9fs_file_readn(filp, NULL, udata, count, *offset); 389 return err;
446 else
447 ret = p9_client_read(fid, NULL, udata, *offset, count);
448
449 if (ret > 0)
450 *offset += ret;
451 390
391 iocb->ki_pos += ret;
452 return ret; 392 return ret;
453} 393}
454 394
455ssize_t
456v9fs_file_write_internal(struct inode *inode, struct p9_fid *fid,
457 const char __user *data, size_t count,
458 loff_t *offset, int invalidate)
459{
460 int n;
461 loff_t i_size;
462 size_t total = 0;
463 loff_t origin = *offset;
464 unsigned long pg_start, pg_end;
465
466 p9_debug(P9_DEBUG_VFS, "data %p count %d offset %x\n",
467 data, (int)count, (int)*offset);
468
469 do {
470 n = p9_client_write(fid, NULL, data+total, origin+total, count);
471 if (n <= 0)
472 break;
473 count -= n;
474 total += n;
475 } while (count > 0);
476
477 if (invalidate && (total > 0)) {
478 pg_start = origin >> PAGE_CACHE_SHIFT;
479 pg_end = (origin + total - 1) >> PAGE_CACHE_SHIFT;
480 if (inode->i_mapping && inode->i_mapping->nrpages)
481 invalidate_inode_pages2_range(inode->i_mapping,
482 pg_start, pg_end);
483 *offset += total;
484 i_size = i_size_read(inode);
485 if (*offset > i_size) {
486 inode_add_bytes(inode, *offset - i_size);
487 i_size_write(inode, *offset);
488 }
489 }
490 if (n < 0)
491 return n;
492
493 return total;
494}
495
496/** 395/**
497 * v9fs_file_write - write to a file 396 * v9fs_file_write - write to a file
498 * @filp: file pointer to write 397 * @filp: file pointer to write
@@ -502,35 +401,45 @@ v9fs_file_write_internal(struct inode *inode, struct p9_fid *fid,
502 * 401 *
503 */ 402 */
504static ssize_t 403static ssize_t
505v9fs_file_write(struct file *filp, const char __user * data, 404v9fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
506 size_t count, loff_t *offset)
507{ 405{
406 struct file *file = iocb->ki_filp;
508 ssize_t retval = 0; 407 ssize_t retval = 0;
509 loff_t origin = *offset; 408 loff_t origin = iocb->ki_pos;
409 size_t count = iov_iter_count(from);
410 int err = 0;
510 411
511 412 retval = generic_write_checks(file, &origin, &count, 0);
512 retval = generic_write_checks(filp, &origin, &count, 0);
513 if (retval) 413 if (retval)
514 goto out; 414 return retval;
415
416 iov_iter_truncate(from, count);
515 417
516 retval = -EINVAL;
517 if ((ssize_t) count < 0)
518 goto out;
519 retval = 0;
520 if (!count) 418 if (!count)
521 goto out; 419 return 0;
522 420
523 retval = v9fs_file_write_internal(file_inode(filp), 421 retval = p9_client_write(file->private_data, origin, from, &err);
524 filp->private_data, 422 if (retval > 0) {
525 data, count, &origin, 1); 423 struct inode *inode = file_inode(file);
526 /* update offset on successful write */ 424 loff_t i_size;
527 if (retval > 0) 425 unsigned long pg_start, pg_end;
528 *offset = origin; 426 pg_start = origin >> PAGE_CACHE_SHIFT;
529out: 427 pg_end = (origin + retval - 1) >> PAGE_CACHE_SHIFT;
530 return retval; 428 if (inode->i_mapping && inode->i_mapping->nrpages)
429 invalidate_inode_pages2_range(inode->i_mapping,
430 pg_start, pg_end);
431 origin += retval;
432 i_size = i_size_read(inode);
433 iocb->ki_pos = origin;
434 if (origin > i_size) {
435 inode_add_bytes(inode, origin - i_size);
436 i_size_write(inode, origin);
437 }
438 return retval;
439 }
440 return err;
531} 441}
532 442
533
534static int v9fs_file_fsync(struct file *filp, loff_t start, loff_t end, 443static int v9fs_file_fsync(struct file *filp, loff_t start, loff_t end,
535 int datasync) 444 int datasync)
536{ 445{
@@ -657,44 +566,6 @@ out_unlock:
657 return VM_FAULT_NOPAGE; 566 return VM_FAULT_NOPAGE;
658} 567}
659 568
660static ssize_t
661v9fs_direct_read(struct file *filp, char __user *udata, size_t count,
662 loff_t *offsetp)
663{
664 loff_t size, offset;
665 struct inode *inode;
666 struct address_space *mapping;
667
668 offset = *offsetp;
669 mapping = filp->f_mapping;
670 inode = mapping->host;
671 if (!count)
672 return 0;
673 size = i_size_read(inode);
674 if (offset < size)
675 filemap_write_and_wait_range(mapping, offset,
676 offset + count - 1);
677
678 return v9fs_file_read(filp, udata, count, offsetp);
679}
680
681/**
682 * v9fs_cached_file_read - read from a file
683 * @filp: file pointer to read
684 * @data: user data buffer to read data into
685 * @count: size of buffer
686 * @offset: offset at which to read data
687 *
688 */
689static ssize_t
690v9fs_cached_file_read(struct file *filp, char __user *data, size_t count,
691 loff_t *offset)
692{
693 if (filp->f_flags & O_DIRECT)
694 return v9fs_direct_read(filp, data, count, offset);
695 return new_sync_read(filp, data, count, offset);
696}
697
698/** 569/**
699 * v9fs_mmap_file_read - read from a file 570 * v9fs_mmap_file_read - read from a file
700 * @filp: file pointer to read 571 * @filp: file pointer to read
@@ -704,84 +575,12 @@ v9fs_cached_file_read(struct file *filp, char __user *data, size_t count,
704 * 575 *
705 */ 576 */
706static ssize_t 577static ssize_t
707v9fs_mmap_file_read(struct file *filp, char __user *data, size_t count, 578v9fs_mmap_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
708 loff_t *offset)
709{ 579{
710 /* TODO: Check if there are dirty pages */ 580 /* TODO: Check if there are dirty pages */
711 return v9fs_file_read(filp, data, count, offset); 581 return v9fs_file_read_iter(iocb, to);
712} 582}
713 583
714static ssize_t
715v9fs_direct_write(struct file *filp, const char __user * data,
716 size_t count, loff_t *offsetp)
717{
718 loff_t offset;
719 ssize_t retval;
720 struct inode *inode;
721 struct address_space *mapping;
722
723 offset = *offsetp;
724 mapping = filp->f_mapping;
725 inode = mapping->host;
726 if (!count)
727 return 0;
728
729 mutex_lock(&inode->i_mutex);
730 retval = filemap_write_and_wait_range(mapping, offset,
731 offset + count - 1);
732 if (retval)
733 goto err_out;
734 /*
735 * After a write we want buffered reads to be sure to go to disk to get
736 * the new data. We invalidate clean cached page from the region we're
737 * about to write. We do this *before* the write so that if we fail
738 * here we fall back to buffered write
739 */
740 if (mapping->nrpages) {
741 pgoff_t pg_start = offset >> PAGE_CACHE_SHIFT;
742 pgoff_t pg_end = (offset + count - 1) >> PAGE_CACHE_SHIFT;
743
744 retval = invalidate_inode_pages2_range(mapping,
745 pg_start, pg_end);
746 /*
747 * If a page can not be invalidated, fall back
748 * to buffered write.
749 */
750 if (retval) {
751 if (retval == -EBUSY)
752 goto buff_write;
753 goto err_out;
754 }
755 }
756 retval = v9fs_file_write(filp, data, count, offsetp);
757err_out:
758 mutex_unlock(&inode->i_mutex);
759 return retval;
760
761buff_write:
762 mutex_unlock(&inode->i_mutex);
763 return new_sync_write(filp, data, count, offsetp);
764}
765
766/**
767 * v9fs_cached_file_write - write to a file
768 * @filp: file pointer to write
769 * @data: data buffer to write data from
770 * @count: size of buffer
771 * @offset: offset at which to write data
772 *
773 */
774static ssize_t
775v9fs_cached_file_write(struct file *filp, const char __user * data,
776 size_t count, loff_t *offset)
777{
778
779 if (filp->f_flags & O_DIRECT)
780 return v9fs_direct_write(filp, data, count, offset);
781 return new_sync_write(filp, data, count, offset);
782}
783
784
785/** 584/**
786 * v9fs_mmap_file_write - write to a file 585 * v9fs_mmap_file_write - write to a file
787 * @filp: file pointer to write 586 * @filp: file pointer to write
@@ -791,14 +590,13 @@ v9fs_cached_file_write(struct file *filp, const char __user * data,
791 * 590 *
792 */ 591 */
793static ssize_t 592static ssize_t
794v9fs_mmap_file_write(struct file *filp, const char __user *data, 593v9fs_mmap_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
795 size_t count, loff_t *offset)
796{ 594{
797 /* 595 /*
798 * TODO: invalidate mmaps on filp's inode between 596 * TODO: invalidate mmaps on filp's inode between
799 * offset and offset+count 597 * offset and offset+count
800 */ 598 */
801 return v9fs_file_write(filp, data, count, offset); 599 return v9fs_file_write_iter(iocb, from);
802} 600}
803 601
804static void v9fs_mmap_vm_close(struct vm_area_struct *vma) 602static void v9fs_mmap_vm_close(struct vm_area_struct *vma)
@@ -843,8 +641,6 @@ static const struct vm_operations_struct v9fs_mmap_file_vm_ops = {
843 641
844const struct file_operations v9fs_cached_file_operations = { 642const struct file_operations v9fs_cached_file_operations = {
845 .llseek = generic_file_llseek, 643 .llseek = generic_file_llseek,
846 .read = v9fs_cached_file_read,
847 .write = v9fs_cached_file_write,
848 .read_iter = generic_file_read_iter, 644 .read_iter = generic_file_read_iter,
849 .write_iter = generic_file_write_iter, 645 .write_iter = generic_file_write_iter,
850 .open = v9fs_file_open, 646 .open = v9fs_file_open,
@@ -856,8 +652,6 @@ const struct file_operations v9fs_cached_file_operations = {
856 652
857const struct file_operations v9fs_cached_file_operations_dotl = { 653const struct file_operations v9fs_cached_file_operations_dotl = {
858 .llseek = generic_file_llseek, 654 .llseek = generic_file_llseek,
859 .read = v9fs_cached_file_read,
860 .write = v9fs_cached_file_write,
861 .read_iter = generic_file_read_iter, 655 .read_iter = generic_file_read_iter,
862 .write_iter = generic_file_write_iter, 656 .write_iter = generic_file_write_iter,
863 .open = v9fs_file_open, 657 .open = v9fs_file_open,
@@ -870,8 +664,8 @@ const struct file_operations v9fs_cached_file_operations_dotl = {
870 664
871const struct file_operations v9fs_file_operations = { 665const struct file_operations v9fs_file_operations = {
872 .llseek = generic_file_llseek, 666 .llseek = generic_file_llseek,
873 .read = v9fs_file_read, 667 .read_iter = v9fs_file_read_iter,
874 .write = v9fs_file_write, 668 .write_iter = v9fs_file_write_iter,
875 .open = v9fs_file_open, 669 .open = v9fs_file_open,
876 .release = v9fs_dir_release, 670 .release = v9fs_dir_release,
877 .lock = v9fs_file_lock, 671 .lock = v9fs_file_lock,
@@ -881,8 +675,8 @@ const struct file_operations v9fs_file_operations = {
881 675
882const struct file_operations v9fs_file_operations_dotl = { 676const struct file_operations v9fs_file_operations_dotl = {
883 .llseek = generic_file_llseek, 677 .llseek = generic_file_llseek,
884 .read = v9fs_file_read, 678 .read_iter = v9fs_file_read_iter,
885 .write = v9fs_file_write, 679 .write_iter = v9fs_file_write_iter,
886 .open = v9fs_file_open, 680 .open = v9fs_file_open,
887 .release = v9fs_dir_release, 681 .release = v9fs_dir_release,
888 .lock = v9fs_file_lock_dotl, 682 .lock = v9fs_file_lock_dotl,
@@ -893,8 +687,8 @@ const struct file_operations v9fs_file_operations_dotl = {
893 687
894const struct file_operations v9fs_mmap_file_operations = { 688const struct file_operations v9fs_mmap_file_operations = {
895 .llseek = generic_file_llseek, 689 .llseek = generic_file_llseek,
896 .read = v9fs_mmap_file_read, 690 .read_iter = v9fs_mmap_file_read_iter,
897 .write = v9fs_mmap_file_write, 691 .write_iter = v9fs_mmap_file_write_iter,
898 .open = v9fs_file_open, 692 .open = v9fs_file_open,
899 .release = v9fs_dir_release, 693 .release = v9fs_dir_release,
900 .lock = v9fs_file_lock, 694 .lock = v9fs_file_lock,
@@ -904,8 +698,8 @@ const struct file_operations v9fs_mmap_file_operations = {
904 698
905const struct file_operations v9fs_mmap_file_operations_dotl = { 699const struct file_operations v9fs_mmap_file_operations_dotl = {
906 .llseek = generic_file_llseek, 700 .llseek = generic_file_llseek,
907 .read = v9fs_mmap_file_read, 701 .read_iter = v9fs_mmap_file_read_iter,
908 .write = v9fs_mmap_file_write, 702 .write_iter = v9fs_mmap_file_write_iter,
909 .open = v9fs_file_open, 703 .open = v9fs_file_open,
910 .release = v9fs_dir_release, 704 .release = v9fs_dir_release,
911 .lock = v9fs_file_lock_dotl, 705 .lock = v9fs_file_lock_dotl,
diff --git a/fs/9p/xattr.c b/fs/9p/xattr.c
index f95e01e058e4..0cf44b6cccd6 100644
--- a/fs/9p/xattr.c
+++ b/fs/9p/xattr.c
@@ -15,6 +15,7 @@
15#include <linux/module.h> 15#include <linux/module.h>
16#include <linux/fs.h> 16#include <linux/fs.h>
17#include <linux/sched.h> 17#include <linux/sched.h>
18#include <linux/uio.h>
18#include <net/9p/9p.h> 19#include <net/9p/9p.h>
19#include <net/9p/client.h> 20#include <net/9p/client.h>
20 21
@@ -25,50 +26,34 @@ ssize_t v9fs_fid_xattr_get(struct p9_fid *fid, const char *name,
25 void *buffer, size_t buffer_size) 26 void *buffer, size_t buffer_size)
26{ 27{
27 ssize_t retval; 28 ssize_t retval;
28 int msize, read_count; 29 u64 attr_size;
29 u64 offset = 0, attr_size;
30 struct p9_fid *attr_fid; 30 struct p9_fid *attr_fid;
31 struct kvec kvec = {.iov_base = buffer, .iov_len = buffer_size};
32 struct iov_iter to;
33 int err;
34
35 iov_iter_kvec(&to, READ | ITER_KVEC, &kvec, 1, buffer_size);
31 36
32 attr_fid = p9_client_xattrwalk(fid, name, &attr_size); 37 attr_fid = p9_client_xattrwalk(fid, name, &attr_size);
33 if (IS_ERR(attr_fid)) { 38 if (IS_ERR(attr_fid)) {
34 retval = PTR_ERR(attr_fid); 39 retval = PTR_ERR(attr_fid);
35 p9_debug(P9_DEBUG_VFS, "p9_client_attrwalk failed %zd\n", 40 p9_debug(P9_DEBUG_VFS, "p9_client_attrwalk failed %zd\n",
36 retval); 41 retval);
37 attr_fid = NULL; 42 return retval;
38 goto error;
39 }
40 if (!buffer_size) {
41 /* request to get the attr_size */
42 retval = attr_size;
43 goto error;
44 } 43 }
45 if (attr_size > buffer_size) { 44 if (attr_size > buffer_size) {
46 retval = -ERANGE; 45 if (!buffer_size) /* request to get the attr_size */
47 goto error; 46 retval = attr_size;
48 }
49 msize = attr_fid->clnt->msize;
50 while (attr_size) {
51 if (attr_size > (msize - P9_IOHDRSZ))
52 read_count = msize - P9_IOHDRSZ;
53 else 47 else
54 read_count = attr_size; 48 retval = -ERANGE;
55 read_count = p9_client_read(attr_fid, ((char *)buffer)+offset, 49 } else {
56 NULL, offset, read_count); 50 iov_iter_truncate(&to, attr_size);
57 if (read_count < 0) { 51 retval = p9_client_read(attr_fid, 0, &to, &err);
58 /* error in xattr read */ 52 if (err)
59 retval = read_count; 53 retval = err;
60 goto error;
61 }
62 offset += read_count;
63 attr_size -= read_count;
64 } 54 }
65 /* Total read xattr bytes */ 55 p9_client_clunk(attr_fid);
66 retval = offset;
67error:
68 if (attr_fid)
69 p9_client_clunk(attr_fid);
70 return retval; 56 return retval;
71
72} 57}
73 58
74 59
@@ -120,8 +105,11 @@ int v9fs_xattr_set(struct dentry *dentry, const char *name,
120int v9fs_fid_xattr_set(struct p9_fid *fid, const char *name, 105int v9fs_fid_xattr_set(struct p9_fid *fid, const char *name,
121 const void *value, size_t value_len, int flags) 106 const void *value, size_t value_len, int flags)
122{ 107{
123 u64 offset = 0; 108 struct kvec kvec = {.iov_base = (void *)value, .iov_len = value_len};
124 int retval, msize, write_count; 109 struct iov_iter from;
110 int retval;
111
112 iov_iter_kvec(&from, WRITE | ITER_KVEC, &kvec, 1, value_len);
125 113
126 p9_debug(P9_DEBUG_VFS, "name = %s value_len = %zu flags = %d\n", 114 p9_debug(P9_DEBUG_VFS, "name = %s value_len = %zu flags = %d\n",
127 name, value_len, flags); 115 name, value_len, flags);
@@ -135,29 +123,11 @@ int v9fs_fid_xattr_set(struct p9_fid *fid, const char *name,
135 * On success fid points to xattr 123 * On success fid points to xattr
136 */ 124 */
137 retval = p9_client_xattrcreate(fid, name, value_len, flags); 125 retval = p9_client_xattrcreate(fid, name, value_len, flags);
138 if (retval < 0) { 126 if (retval < 0)
139 p9_debug(P9_DEBUG_VFS, "p9_client_xattrcreate failed %d\n", 127 p9_debug(P9_DEBUG_VFS, "p9_client_xattrcreate failed %d\n",
140 retval); 128 retval);
141 goto err; 129 else
142 } 130 p9_client_write(fid, 0, &from, &retval);
143 msize = fid->clnt->msize;
144 while (value_len) {
145 if (value_len > (msize - P9_IOHDRSZ))
146 write_count = msize - P9_IOHDRSZ;
147 else
148 write_count = value_len;
149 write_count = p9_client_write(fid, ((char *)value)+offset,
150 NULL, offset, write_count);
151 if (write_count < 0) {
152 /* error in xattr write */
153 retval = write_count;
154 goto err;
155 }
156 offset += write_count;
157 value_len -= write_count;
158 }
159 retval = 0;
160err:
161 p9_client_clunk(fid); 131 p9_client_clunk(fid);
162 return retval; 132 return retval;
163} 133}
diff --git a/fs/adfs/file.c b/fs/adfs/file.c
index 07c9edce5aa7..46c0d5671cd5 100644
--- a/fs/adfs/file.c
+++ b/fs/adfs/file.c
@@ -23,11 +23,9 @@
23 23
24const struct file_operations adfs_file_operations = { 24const struct file_operations adfs_file_operations = {
25 .llseek = generic_file_llseek, 25 .llseek = generic_file_llseek,
26 .read = new_sync_read,
27 .read_iter = generic_file_read_iter, 26 .read_iter = generic_file_read_iter,
28 .mmap = generic_file_mmap, 27 .mmap = generic_file_mmap,
29 .fsync = generic_file_fsync, 28 .fsync = generic_file_fsync,
30 .write = new_sync_write,
31 .write_iter = generic_file_write_iter, 29 .write_iter = generic_file_write_iter,
32 .splice_read = generic_file_splice_read, 30 .splice_read = generic_file_splice_read,
33}; 31};
diff --git a/fs/affs/file.c b/fs/affs/file.c
index 3aa7eb66547e..7c1a3d4c19c2 100644
--- a/fs/affs/file.c
+++ b/fs/affs/file.c
@@ -969,9 +969,7 @@ int affs_file_fsync(struct file *filp, loff_t start, loff_t end, int datasync)
969} 969}
970const struct file_operations affs_file_operations = { 970const struct file_operations affs_file_operations = {
971 .llseek = generic_file_llseek, 971 .llseek = generic_file_llseek,
972 .read = new_sync_read,
973 .read_iter = generic_file_read_iter, 972 .read_iter = generic_file_read_iter,
974 .write = new_sync_write,
975 .write_iter = generic_file_write_iter, 973 .write_iter = generic_file_write_iter,
976 .mmap = generic_file_mmap, 974 .mmap = generic_file_mmap,
977 .open = affs_file_open, 975 .open = affs_file_open,
diff --git a/fs/afs/file.c b/fs/afs/file.c
index 932ce07948b3..999bc3caec92 100644
--- a/fs/afs/file.c
+++ b/fs/afs/file.c
@@ -31,8 +31,6 @@ const struct file_operations afs_file_operations = {
31 .open = afs_open, 31 .open = afs_open,
32 .release = afs_release, 32 .release = afs_release,
33 .llseek = generic_file_llseek, 33 .llseek = generic_file_llseek,
34 .read = new_sync_read,
35 .write = new_sync_write,
36 .read_iter = generic_file_read_iter, 34 .read_iter = generic_file_read_iter,
37 .write_iter = afs_file_write, 35 .write_iter = afs_file_write,
38 .mmap = generic_file_readonly_mmap, 36 .mmap = generic_file_readonly_mmap,
diff --git a/fs/aio.c b/fs/aio.c
index 1ab60010cf6c..5785c4b58fea 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -692,8 +692,7 @@ static struct kioctx *ioctx_alloc(unsigned nr_events)
692 nr_events *= 2; 692 nr_events *= 2;
693 693
694 /* Prevent overflows */ 694 /* Prevent overflows */
695 if ((nr_events > (0x10000000U / sizeof(struct io_event))) || 695 if (nr_events > (0x10000000U / sizeof(struct io_event))) {
696 (nr_events > (0x10000000U / sizeof(struct kiocb)))) {
697 pr_debug("ENOMEM: nr_events too high\n"); 696 pr_debug("ENOMEM: nr_events too high\n");
698 return ERR_PTR(-EINVAL); 697 return ERR_PTR(-EINVAL);
699 } 698 }
@@ -1356,8 +1355,6 @@ SYSCALL_DEFINE1(io_destroy, aio_context_t, ctx)
1356 return -EINVAL; 1355 return -EINVAL;
1357} 1356}
1358 1357
1359typedef ssize_t (aio_rw_op)(struct kiocb *, const struct iovec *,
1360 unsigned long, loff_t);
1361typedef ssize_t (rw_iter_op)(struct kiocb *, struct iov_iter *); 1358typedef ssize_t (rw_iter_op)(struct kiocb *, struct iov_iter *);
1362 1359
1363static int aio_setup_vectored_rw(int rw, char __user *buf, size_t len, 1360static int aio_setup_vectored_rw(int rw, char __user *buf, size_t len,
@@ -1386,7 +1383,6 @@ static ssize_t aio_run_iocb(struct kiocb *req, unsigned opcode,
1386 ssize_t ret; 1383 ssize_t ret;
1387 int rw; 1384 int rw;
1388 fmode_t mode; 1385 fmode_t mode;
1389 aio_rw_op *rw_op;
1390 rw_iter_op *iter_op; 1386 rw_iter_op *iter_op;
1391 struct iovec inline_vecs[UIO_FASTIOV], *iovec = inline_vecs; 1387 struct iovec inline_vecs[UIO_FASTIOV], *iovec = inline_vecs;
1392 struct iov_iter iter; 1388 struct iov_iter iter;
@@ -1396,7 +1392,6 @@ static ssize_t aio_run_iocb(struct kiocb *req, unsigned opcode,
1396 case IOCB_CMD_PREADV: 1392 case IOCB_CMD_PREADV:
1397 mode = FMODE_READ; 1393 mode = FMODE_READ;
1398 rw = READ; 1394 rw = READ;
1399 rw_op = file->f_op->aio_read;
1400 iter_op = file->f_op->read_iter; 1395 iter_op = file->f_op->read_iter;
1401 goto rw_common; 1396 goto rw_common;
1402 1397
@@ -1404,14 +1399,13 @@ static ssize_t aio_run_iocb(struct kiocb *req, unsigned opcode,
1404 case IOCB_CMD_PWRITEV: 1399 case IOCB_CMD_PWRITEV:
1405 mode = FMODE_WRITE; 1400 mode = FMODE_WRITE;
1406 rw = WRITE; 1401 rw = WRITE;
1407 rw_op = file->f_op->aio_write;
1408 iter_op = file->f_op->write_iter; 1402 iter_op = file->f_op->write_iter;
1409 goto rw_common; 1403 goto rw_common;
1410rw_common: 1404rw_common:
1411 if (unlikely(!(file->f_mode & mode))) 1405 if (unlikely(!(file->f_mode & mode)))
1412 return -EBADF; 1406 return -EBADF;
1413 1407
1414 if (!rw_op && !iter_op) 1408 if (!iter_op)
1415 return -EINVAL; 1409 return -EINVAL;
1416 1410
1417 if (opcode == IOCB_CMD_PREADV || opcode == IOCB_CMD_PWRITEV) 1411 if (opcode == IOCB_CMD_PREADV || opcode == IOCB_CMD_PWRITEV)
@@ -1431,21 +1425,10 @@ rw_common:
1431 1425
1432 len = ret; 1426 len = ret;
1433 1427
1434 /* XXX: move/kill - rw_verify_area()? */
1435 /* This matches the pread()/pwrite() logic */
1436 if (req->ki_pos < 0) {
1437 ret = -EINVAL;
1438 break;
1439 }
1440
1441 if (rw == WRITE) 1428 if (rw == WRITE)
1442 file_start_write(file); 1429 file_start_write(file);
1443 1430
1444 if (iter_op) { 1431 ret = iter_op(req, &iter);
1445 ret = iter_op(req, &iter);
1446 } else {
1447 ret = rw_op(req, iter.iov, iter.nr_segs, req->ki_pos);
1448 }
1449 1432
1450 if (rw == WRITE) 1433 if (rw == WRITE)
1451 file_end_write(file); 1434 file_end_write(file);
diff --git a/fs/autofs4/autofs_i.h b/fs/autofs4/autofs_i.h
index 8e98cf954bab..d10e619632ab 100644
--- a/fs/autofs4/autofs_i.h
+++ b/fs/autofs4/autofs_i.h
@@ -213,7 +213,7 @@ void autofs4_clean_ino(struct autofs_info *);
213 213
214static inline int autofs_prepare_pipe(struct file *pipe) 214static inline int autofs_prepare_pipe(struct file *pipe)
215{ 215{
216 if (!pipe->f_op->write) 216 if (!(pipe->f_mode & FMODE_CAN_WRITE))
217 return -EINVAL; 217 return -EINVAL;
218 if (!S_ISFIFO(file_inode(pipe)->i_mode)) 218 if (!S_ISFIFO(file_inode(pipe)->i_mode))
219 return -EINVAL; 219 return -EINVAL;
diff --git a/fs/autofs4/waitq.c b/fs/autofs4/waitq.c
index 116fd38ee472..2ad05ab93db8 100644
--- a/fs/autofs4/waitq.c
+++ b/fs/autofs4/waitq.c
@@ -70,7 +70,7 @@ static int autofs4_write(struct autofs_sb_info *sbi,
70 70
71 mutex_lock(&sbi->pipe_mutex); 71 mutex_lock(&sbi->pipe_mutex);
72 while (bytes && 72 while (bytes &&
73 (wr = file->f_op->write(file,data,bytes,&file->f_pos)) > 0) { 73 (wr = __vfs_write(file,data,bytes,&file->f_pos)) > 0) {
74 data += wr; 74 data += wr;
75 bytes -= wr; 75 bytes -= wr;
76 } 76 }
diff --git a/fs/bfs/file.c b/fs/bfs/file.c
index e7f88ace1a25..97f1b5160155 100644
--- a/fs/bfs/file.c
+++ b/fs/bfs/file.c
@@ -23,9 +23,7 @@
23 23
24const struct file_operations bfs_file_operations = { 24const struct file_operations bfs_file_operations = {
25 .llseek = generic_file_llseek, 25 .llseek = generic_file_llseek,
26 .read = new_sync_read,
27 .read_iter = generic_file_read_iter, 26 .read_iter = generic_file_read_iter,
28 .write = new_sync_write,
29 .write_iter = generic_file_write_iter, 27 .write_iter = generic_file_write_iter,
30 .mmap = generic_file_mmap, 28 .mmap = generic_file_mmap,
31 .splice_read = generic_file_splice_read, 29 .splice_read = generic_file_splice_read,
diff --git a/fs/block_dev.c b/fs/block_dev.c
index 2e522aed6584..b5e87896f517 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1659,8 +1659,6 @@ const struct file_operations def_blk_fops = {
1659 .open = blkdev_open, 1659 .open = blkdev_open,
1660 .release = blkdev_close, 1660 .release = blkdev_close,
1661 .llseek = block_llseek, 1661 .llseek = block_llseek,
1662 .read = new_sync_read,
1663 .write = new_sync_write,
1664 .read_iter = blkdev_read_iter, 1662 .read_iter = blkdev_read_iter,
1665 .write_iter = blkdev_write_iter, 1663 .write_iter = blkdev_write_iter,
1666 .mmap = generic_file_mmap, 1664 .mmap = generic_file_mmap,
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index aee18f84e315..cdc801c85105 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -2806,8 +2806,6 @@ out:
2806 2806
2807const struct file_operations btrfs_file_operations = { 2807const struct file_operations btrfs_file_operations = {
2808 .llseek = btrfs_file_llseek, 2808 .llseek = btrfs_file_llseek,
2809 .read = new_sync_read,
2810 .write = new_sync_write,
2811 .read_iter = generic_file_read_iter, 2809 .read_iter = generic_file_read_iter,
2812 .splice_read = generic_file_splice_read, 2810 .splice_read = generic_file_splice_read,
2813 .write_iter = btrfs_file_write_iter, 2811 .write_iter = btrfs_file_write_iter,
diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index 139f2fea91a0..56237ea5fc22 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -1331,8 +1331,6 @@ const struct file_operations ceph_file_fops = {
1331 .open = ceph_open, 1331 .open = ceph_open,
1332 .release = ceph_release, 1332 .release = ceph_release,
1333 .llseek = ceph_llseek, 1333 .llseek = ceph_llseek,
1334 .read = new_sync_read,
1335 .write = new_sync_write,
1336 .read_iter = ceph_read_iter, 1334 .read_iter = ceph_read_iter,
1337 .write_iter = ceph_write_iter, 1335 .write_iter = ceph_write_iter,
1338 .mmap = ceph_mmap, 1336 .mmap = ceph_mmap,
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
index d72fe37f5420..eaab4b2a0595 100644
--- a/fs/cifs/cifsfs.c
+++ b/fs/cifs/cifsfs.c
@@ -906,8 +906,6 @@ const struct inode_operations cifs_symlink_inode_ops = {
906}; 906};
907 907
908const struct file_operations cifs_file_ops = { 908const struct file_operations cifs_file_ops = {
909 .read = new_sync_read,
910 .write = new_sync_write,
911 .read_iter = cifs_loose_read_iter, 909 .read_iter = cifs_loose_read_iter,
912 .write_iter = cifs_file_write_iter, 910 .write_iter = cifs_file_write_iter,
913 .open = cifs_open, 911 .open = cifs_open,
@@ -926,8 +924,6 @@ const struct file_operations cifs_file_ops = {
926}; 924};
927 925
928const struct file_operations cifs_file_strict_ops = { 926const struct file_operations cifs_file_strict_ops = {
929 .read = new_sync_read,
930 .write = new_sync_write,
931 .read_iter = cifs_strict_readv, 927 .read_iter = cifs_strict_readv,
932 .write_iter = cifs_strict_writev, 928 .write_iter = cifs_strict_writev,
933 .open = cifs_open, 929 .open = cifs_open,
@@ -947,8 +943,6 @@ const struct file_operations cifs_file_strict_ops = {
947 943
948const struct file_operations cifs_file_direct_ops = { 944const struct file_operations cifs_file_direct_ops = {
949 /* BB reevaluate whether they can be done with directio, no cache */ 945 /* BB reevaluate whether they can be done with directio, no cache */
950 .read = new_sync_read,
951 .write = new_sync_write,
952 .read_iter = cifs_user_readv, 946 .read_iter = cifs_user_readv,
953 .write_iter = cifs_user_writev, 947 .write_iter = cifs_user_writev,
954 .open = cifs_open, 948 .open = cifs_open,
@@ -967,8 +961,6 @@ const struct file_operations cifs_file_direct_ops = {
967}; 961};
968 962
969const struct file_operations cifs_file_nobrl_ops = { 963const struct file_operations cifs_file_nobrl_ops = {
970 .read = new_sync_read,
971 .write = new_sync_write,
972 .read_iter = cifs_loose_read_iter, 964 .read_iter = cifs_loose_read_iter,
973 .write_iter = cifs_file_write_iter, 965 .write_iter = cifs_file_write_iter,
974 .open = cifs_open, 966 .open = cifs_open,
@@ -986,8 +978,6 @@ const struct file_operations cifs_file_nobrl_ops = {
986}; 978};
987 979
988const struct file_operations cifs_file_strict_nobrl_ops = { 980const struct file_operations cifs_file_strict_nobrl_ops = {
989 .read = new_sync_read,
990 .write = new_sync_write,
991 .read_iter = cifs_strict_readv, 981 .read_iter = cifs_strict_readv,
992 .write_iter = cifs_strict_writev, 982 .write_iter = cifs_strict_writev,
993 .open = cifs_open, 983 .open = cifs_open,
@@ -1006,8 +996,6 @@ const struct file_operations cifs_file_strict_nobrl_ops = {
1006 996
1007const struct file_operations cifs_file_direct_nobrl_ops = { 997const struct file_operations cifs_file_direct_nobrl_ops = {
1008 /* BB reevaluate whether they can be done with directio, no cache */ 998 /* BB reevaluate whether they can be done with directio, no cache */
1009 .read = new_sync_read,
1010 .write = new_sync_write,
1011 .read_iter = cifs_user_readv, 999 .read_iter = cifs_user_readv,
1012 .write_iter = cifs_user_writev, 1000 .write_iter = cifs_user_writev,
1013 .open = cifs_open, 1001 .open = cifs_open,
diff --git a/fs/coda/file.c b/fs/coda/file.c
index d244d743a232..1da3805f3ddc 100644
--- a/fs/coda/file.c
+++ b/fs/coda/file.c
@@ -27,19 +27,14 @@
27#include "coda_int.h" 27#include "coda_int.h"
28 28
29static ssize_t 29static ssize_t
30coda_file_read(struct file *coda_file, char __user *buf, size_t count, loff_t *ppos) 30coda_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
31{ 31{
32 struct coda_file_info *cfi; 32 struct file *coda_file = iocb->ki_filp;
33 struct file *host_file; 33 struct coda_file_info *cfi = CODA_FTOC(coda_file);
34 34
35 cfi = CODA_FTOC(coda_file);
36 BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); 35 BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC);
37 host_file = cfi->cfi_container;
38 36
39 if (!host_file->f_op->read) 37 return vfs_iter_read(cfi->cfi_container, to, &iocb->ki_pos);
40 return -EINVAL;
41
42 return host_file->f_op->read(host_file, buf, count, ppos);
43} 38}
44 39
45static ssize_t 40static ssize_t
@@ -64,32 +59,25 @@ coda_file_splice_read(struct file *coda_file, loff_t *ppos,
64} 59}
65 60
66static ssize_t 61static ssize_t
67coda_file_write(struct file *coda_file, const char __user *buf, size_t count, loff_t *ppos) 62coda_file_write_iter(struct kiocb *iocb, struct iov_iter *to)
68{ 63{
69 struct inode *host_inode, *coda_inode = file_inode(coda_file); 64 struct file *coda_file = iocb->ki_filp;
70 struct coda_file_info *cfi; 65 struct inode *coda_inode = file_inode(coda_file);
66 struct coda_file_info *cfi = CODA_FTOC(coda_file);
71 struct file *host_file; 67 struct file *host_file;
72 ssize_t ret; 68 ssize_t ret;
73 69
74 cfi = CODA_FTOC(coda_file);
75 BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); 70 BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC);
76 host_file = cfi->cfi_container;
77
78 if (!host_file->f_op->write)
79 return -EINVAL;
80 71
81 host_inode = file_inode(host_file); 72 host_file = cfi->cfi_container;
82 file_start_write(host_file); 73 file_start_write(host_file);
83 mutex_lock(&coda_inode->i_mutex); 74 mutex_lock(&coda_inode->i_mutex);
84 75 ret = vfs_iter_write(cfi->cfi_container, to, &iocb->ki_pos);
85 ret = host_file->f_op->write(host_file, buf, count, ppos); 76 coda_inode->i_size = file_inode(host_file)->i_size;
86
87 coda_inode->i_size = host_inode->i_size;
88 coda_inode->i_blocks = (coda_inode->i_size + 511) >> 9; 77 coda_inode->i_blocks = (coda_inode->i_size + 511) >> 9;
89 coda_inode->i_mtime = coda_inode->i_ctime = CURRENT_TIME_SEC; 78 coda_inode->i_mtime = coda_inode->i_ctime = CURRENT_TIME_SEC;
90 mutex_unlock(&coda_inode->i_mutex); 79 mutex_unlock(&coda_inode->i_mutex);
91 file_end_write(host_file); 80 file_end_write(host_file);
92
93 return ret; 81 return ret;
94} 82}
95 83
@@ -231,8 +219,8 @@ int coda_fsync(struct file *coda_file, loff_t start, loff_t end, int datasync)
231 219
232const struct file_operations coda_file_operations = { 220const struct file_operations coda_file_operations = {
233 .llseek = generic_file_llseek, 221 .llseek = generic_file_llseek,
234 .read = coda_file_read, 222 .read_iter = coda_file_read_iter,
235 .write = coda_file_write, 223 .write_iter = coda_file_write_iter,
236 .mmap = coda_file_mmap, 224 .mmap = coda_file_mmap,
237 .open = coda_open, 225 .open = coda_open,
238 .release = coda_release, 226 .release = coda_release,
diff --git a/fs/coredump.c b/fs/coredump.c
index f319926ddf8c..bbbe139ab280 100644
--- a/fs/coredump.c
+++ b/fs/coredump.c
@@ -657,7 +657,7 @@ void do_coredump(const siginfo_t *siginfo)
657 */ 657 */
658 if (!uid_eq(inode->i_uid, current_fsuid())) 658 if (!uid_eq(inode->i_uid, current_fsuid()))
659 goto close_fail; 659 goto close_fail;
660 if (!cprm.file->f_op->write) 660 if (!(cprm.file->f_mode & FMODE_CAN_WRITE))
661 goto close_fail; 661 goto close_fail;
662 if (do_truncate(cprm.file->f_path.dentry, 0, 0, cprm.file)) 662 if (do_truncate(cprm.file->f_path.dentry, 0, 0, cprm.file))
663 goto close_fail; 663 goto close_fail;
diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c
index 79675089443d..a65786e26b05 100644
--- a/fs/ecryptfs/file.c
+++ b/fs/ecryptfs/file.c
@@ -358,9 +358,7 @@ const struct file_operations ecryptfs_dir_fops = {
358 358
359const struct file_operations ecryptfs_main_fops = { 359const struct file_operations ecryptfs_main_fops = {
360 .llseek = generic_file_llseek, 360 .llseek = generic_file_llseek,
361 .read = new_sync_read,
362 .read_iter = ecryptfs_read_update_atime, 361 .read_iter = ecryptfs_read_update_atime,
363 .write = new_sync_write,
364 .write_iter = generic_file_write_iter, 362 .write_iter = generic_file_write_iter,
365 .iterate = ecryptfs_readdir, 363 .iterate = ecryptfs_readdir,
366 .unlocked_ioctl = ecryptfs_unlocked_ioctl, 364 .unlocked_ioctl = ecryptfs_unlocked_ioctl,
diff --git a/fs/exofs/file.c b/fs/exofs/file.c
index 1a376b42d305..906de66e8e7e 100644
--- a/fs/exofs/file.c
+++ b/fs/exofs/file.c
@@ -67,8 +67,6 @@ static int exofs_flush(struct file *file, fl_owner_t id)
67 67
68const struct file_operations exofs_file_operations = { 68const struct file_operations exofs_file_operations = {
69 .llseek = generic_file_llseek, 69 .llseek = generic_file_llseek,
70 .read = new_sync_read,
71 .write = new_sync_write,
72 .read_iter = generic_file_read_iter, 70 .read_iter = generic_file_read_iter,
73 .write_iter = generic_file_write_iter, 71 .write_iter = generic_file_write_iter,
74 .mmap = generic_file_mmap, 72 .mmap = generic_file_mmap,
diff --git a/fs/ext2/file.c b/fs/ext2/file.c
index e31701713516..ef04fdb57dbf 100644
--- a/fs/ext2/file.c
+++ b/fs/ext2/file.c
@@ -92,8 +92,6 @@ int ext2_fsync(struct file *file, loff_t start, loff_t end, int datasync)
92 */ 92 */
93const struct file_operations ext2_file_operations = { 93const struct file_operations ext2_file_operations = {
94 .llseek = generic_file_llseek, 94 .llseek = generic_file_llseek,
95 .read = new_sync_read,
96 .write = new_sync_write,
97 .read_iter = generic_file_read_iter, 95 .read_iter = generic_file_read_iter,
98 .write_iter = generic_file_write_iter, 96 .write_iter = generic_file_write_iter,
99 .unlocked_ioctl = ext2_ioctl, 97 .unlocked_ioctl = ext2_ioctl,
@@ -111,8 +109,6 @@ const struct file_operations ext2_file_operations = {
111#ifdef CONFIG_FS_DAX 109#ifdef CONFIG_FS_DAX
112const struct file_operations ext2_dax_file_operations = { 110const struct file_operations ext2_dax_file_operations = {
113 .llseek = generic_file_llseek, 111 .llseek = generic_file_llseek,
114 .read = new_sync_read,
115 .write = new_sync_write,
116 .read_iter = generic_file_read_iter, 112 .read_iter = generic_file_read_iter,
117 .write_iter = generic_file_write_iter, 113 .write_iter = generic_file_write_iter,
118 .unlocked_ioctl = ext2_ioctl, 114 .unlocked_ioctl = ext2_ioctl,
diff --git a/fs/ext3/file.c b/fs/ext3/file.c
index a062fa1e1b11..3b8f650de22c 100644
--- a/fs/ext3/file.c
+++ b/fs/ext3/file.c
@@ -50,8 +50,6 @@ static int ext3_release_file (struct inode * inode, struct file * filp)
50 50
51const struct file_operations ext3_file_operations = { 51const struct file_operations ext3_file_operations = {
52 .llseek = generic_file_llseek, 52 .llseek = generic_file_llseek,
53 .read = new_sync_read,
54 .write = new_sync_write,
55 .read_iter = generic_file_read_iter, 53 .read_iter = generic_file_read_iter,
56 .write_iter = generic_file_write_iter, 54 .write_iter = generic_file_write_iter,
57 .unlocked_ioctl = ext3_ioctl, 55 .unlocked_ioctl = ext3_ioctl,
diff --git a/fs/ext4/file.c b/fs/ext4/file.c
index 598abbbe6786..9ad03036d9f5 100644
--- a/fs/ext4/file.c
+++ b/fs/ext4/file.c
@@ -607,8 +607,6 @@ loff_t ext4_llseek(struct file *file, loff_t offset, int whence)
607 607
608const struct file_operations ext4_file_operations = { 608const struct file_operations ext4_file_operations = {
609 .llseek = ext4_llseek, 609 .llseek = ext4_llseek,
610 .read = new_sync_read,
611 .write = new_sync_write,
612 .read_iter = generic_file_read_iter, 610 .read_iter = generic_file_read_iter,
613 .write_iter = ext4_file_write_iter, 611 .write_iter = ext4_file_write_iter,
614 .unlocked_ioctl = ext4_ioctl, 612 .unlocked_ioctl = ext4_ioctl,
@@ -627,8 +625,6 @@ const struct file_operations ext4_file_operations = {
627#ifdef CONFIG_FS_DAX 625#ifdef CONFIG_FS_DAX
628const struct file_operations ext4_dax_file_operations = { 626const struct file_operations ext4_dax_file_operations = {
629 .llseek = ext4_llseek, 627 .llseek = ext4_llseek,
630 .read = new_sync_read,
631 .write = new_sync_write,
632 .read_iter = generic_file_read_iter, 628 .read_iter = generic_file_read_iter,
633 .write_iter = ext4_file_write_iter, 629 .write_iter = ext4_file_write_iter,
634 .unlocked_ioctl = ext4_ioctl, 630 .unlocked_ioctl = ext4_ioctl,
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 98dac27bc3f7..df6a0596eccf 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -1104,8 +1104,6 @@ long f2fs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
1104 1104
1105const struct file_operations f2fs_file_operations = { 1105const struct file_operations f2fs_file_operations = {
1106 .llseek = f2fs_llseek, 1106 .llseek = f2fs_llseek,
1107 .read = new_sync_read,
1108 .write = new_sync_write,
1109 .read_iter = generic_file_read_iter, 1107 .read_iter = generic_file_read_iter,
1110 .write_iter = generic_file_write_iter, 1108 .write_iter = generic_file_write_iter,
1111 .open = generic_file_open, 1109 .open = generic_file_open,
diff --git a/fs/fat/file.c b/fs/fat/file.c
index 8429c68e3057..1e98d333879f 100644
--- a/fs/fat/file.c
+++ b/fs/fat/file.c
@@ -170,8 +170,6 @@ int fat_file_fsync(struct file *filp, loff_t start, loff_t end, int datasync)
170 170
171const struct file_operations fat_file_operations = { 171const struct file_operations fat_file_operations = {
172 .llseek = generic_file_llseek, 172 .llseek = generic_file_llseek,
173 .read = new_sync_read,
174 .write = new_sync_write,
175 .read_iter = generic_file_read_iter, 173 .read_iter = generic_file_read_iter,
176 .write_iter = generic_file_write_iter, 174 .write_iter = generic_file_write_iter,
177 .mmap = generic_file_mmap, 175 .mmap = generic_file_mmap,
diff --git a/fs/file_table.c b/fs/file_table.c
index 3f85411b03ce..294174dcc226 100644
--- a/fs/file_table.c
+++ b/fs/file_table.c
@@ -168,10 +168,10 @@ struct file *alloc_file(struct path *path, fmode_t mode,
168 file->f_inode = path->dentry->d_inode; 168 file->f_inode = path->dentry->d_inode;
169 file->f_mapping = path->dentry->d_inode->i_mapping; 169 file->f_mapping = path->dentry->d_inode->i_mapping;
170 if ((mode & FMODE_READ) && 170 if ((mode & FMODE_READ) &&
171 likely(fop->read || fop->aio_read || fop->read_iter)) 171 likely(fop->read || fop->read_iter))
172 mode |= FMODE_CAN_READ; 172 mode |= FMODE_CAN_READ;
173 if ((mode & FMODE_WRITE) && 173 if ((mode & FMODE_WRITE) &&
174 likely(fop->write || fop->aio_write || fop->write_iter)) 174 likely(fop->write || fop->write_iter))
175 mode |= FMODE_CAN_WRITE; 175 mode |= FMODE_CAN_WRITE;
176 file->f_mode = mode; 176 file->f_mode = mode;
177 file->f_op = fop; 177 file->f_op = fop;
diff --git a/fs/fuse/cuse.c b/fs/fuse/cuse.c
index b3fa05032234..e5bbf748b698 100644
--- a/fs/fuse/cuse.c
+++ b/fs/fuse/cuse.c
@@ -88,32 +88,23 @@ static struct list_head *cuse_conntbl_head(dev_t devt)
88 * FUSE file. 88 * FUSE file.
89 */ 89 */
90 90
91static ssize_t cuse_read(struct file *file, char __user *buf, size_t count, 91static ssize_t cuse_read_iter(struct kiocb *kiocb, struct iov_iter *to)
92 loff_t *ppos)
93{ 92{
93 struct fuse_io_priv io = { .async = 0, .file = kiocb->ki_filp };
94 loff_t pos = 0; 94 loff_t pos = 0;
95 struct iovec iov = { .iov_base = buf, .iov_len = count };
96 struct fuse_io_priv io = { .async = 0, .file = file };
97 struct iov_iter ii;
98 iov_iter_init(&ii, READ, &iov, 1, count);
99 95
100 return fuse_direct_io(&io, &ii, &pos, FUSE_DIO_CUSE); 96 return fuse_direct_io(&io, to, &pos, FUSE_DIO_CUSE);
101} 97}
102 98
103static ssize_t cuse_write(struct file *file, const char __user *buf, 99static ssize_t cuse_write_iter(struct kiocb *kiocb, struct iov_iter *from)
104 size_t count, loff_t *ppos)
105{ 100{
101 struct fuse_io_priv io = { .async = 0, .file = kiocb->ki_filp };
106 loff_t pos = 0; 102 loff_t pos = 0;
107 struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = count };
108 struct fuse_io_priv io = { .async = 0, .file = file };
109 struct iov_iter ii;
110 iov_iter_init(&ii, WRITE, &iov, 1, count);
111
112 /* 103 /*
113 * No locking or generic_write_checks(), the server is 104 * No locking or generic_write_checks(), the server is
114 * responsible for locking and sanity checks. 105 * responsible for locking and sanity checks.
115 */ 106 */
116 return fuse_direct_io(&io, &ii, &pos, 107 return fuse_direct_io(&io, from, &pos,
117 FUSE_DIO_WRITE | FUSE_DIO_CUSE); 108 FUSE_DIO_WRITE | FUSE_DIO_CUSE);
118} 109}
119 110
@@ -186,8 +177,8 @@ static long cuse_file_compat_ioctl(struct file *file, unsigned int cmd,
186 177
187static const struct file_operations cuse_frontend_fops = { 178static const struct file_operations cuse_frontend_fops = {
188 .owner = THIS_MODULE, 179 .owner = THIS_MODULE,
189 .read = cuse_read, 180 .read_iter = cuse_read_iter,
190 .write = cuse_write, 181 .write_iter = cuse_write_iter,
191 .open = cuse_open, 182 .open = cuse_open,
192 .release = cuse_release, 183 .release = cuse_release,
193 .unlocked_ioctl = cuse_file_ioctl, 184 .unlocked_ioctl = cuse_file_ioctl,
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
index 95a2797eef66..c8b68ab2e574 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -710,28 +710,26 @@ struct fuse_copy_state {
710 struct fuse_conn *fc; 710 struct fuse_conn *fc;
711 int write; 711 int write;
712 struct fuse_req *req; 712 struct fuse_req *req;
713 const struct iovec *iov; 713 struct iov_iter *iter;
714 struct pipe_buffer *pipebufs; 714 struct pipe_buffer *pipebufs;
715 struct pipe_buffer *currbuf; 715 struct pipe_buffer *currbuf;
716 struct pipe_inode_info *pipe; 716 struct pipe_inode_info *pipe;
717 unsigned long nr_segs; 717 unsigned long nr_segs;
718 unsigned long seglen;
719 unsigned long addr;
720 struct page *pg; 718 struct page *pg;
721 unsigned len; 719 unsigned len;
722 unsigned offset; 720 unsigned offset;
723 unsigned move_pages:1; 721 unsigned move_pages:1;
724}; 722};
725 723
726static void fuse_copy_init(struct fuse_copy_state *cs, struct fuse_conn *fc, 724static void fuse_copy_init(struct fuse_copy_state *cs,
725 struct fuse_conn *fc,
727 int write, 726 int write,
728 const struct iovec *iov, unsigned long nr_segs) 727 struct iov_iter *iter)
729{ 728{
730 memset(cs, 0, sizeof(*cs)); 729 memset(cs, 0, sizeof(*cs));
731 cs->fc = fc; 730 cs->fc = fc;
732 cs->write = write; 731 cs->write = write;
733 cs->iov = iov; 732 cs->iter = iter;
734 cs->nr_segs = nr_segs;
735} 733}
736 734
737/* Unmap and put previous page of userspace buffer */ 735/* Unmap and put previous page of userspace buffer */
@@ -799,22 +797,16 @@ static int fuse_copy_fill(struct fuse_copy_state *cs)
799 cs->nr_segs++; 797 cs->nr_segs++;
800 } 798 }
801 } else { 799 } else {
802 if (!cs->seglen) { 800 size_t off;
803 BUG_ON(!cs->nr_segs); 801 err = iov_iter_get_pages(cs->iter, &page, PAGE_SIZE, 1, &off);
804 cs->seglen = cs->iov[0].iov_len;
805 cs->addr = (unsigned long) cs->iov[0].iov_base;
806 cs->iov++;
807 cs->nr_segs--;
808 }
809 err = get_user_pages_fast(cs->addr, 1, cs->write, &page);
810 if (err < 0) 802 if (err < 0)
811 return err; 803 return err;
812 BUG_ON(err != 1); 804 BUG_ON(!err);
805 cs->len = err;
806 cs->offset = off;
813 cs->pg = page; 807 cs->pg = page;
814 cs->offset = cs->addr % PAGE_SIZE; 808 cs->offset = off;
815 cs->len = min(PAGE_SIZE - cs->offset, cs->seglen); 809 iov_iter_advance(cs->iter, err);
816 cs->seglen -= cs->len;
817 cs->addr += cs->len;
818 } 810 }
819 811
820 return lock_request(cs->fc, cs->req); 812 return lock_request(cs->fc, cs->req);
@@ -1363,8 +1355,7 @@ static int fuse_dev_open(struct inode *inode, struct file *file)
1363 return 0; 1355 return 0;
1364} 1356}
1365 1357
1366static ssize_t fuse_dev_read(struct kiocb *iocb, const struct iovec *iov, 1358static ssize_t fuse_dev_read(struct kiocb *iocb, struct iov_iter *to)
1367 unsigned long nr_segs, loff_t pos)
1368{ 1359{
1369 struct fuse_copy_state cs; 1360 struct fuse_copy_state cs;
1370 struct file *file = iocb->ki_filp; 1361 struct file *file = iocb->ki_filp;
@@ -1372,9 +1363,12 @@ static ssize_t fuse_dev_read(struct kiocb *iocb, const struct iovec *iov,
1372 if (!fc) 1363 if (!fc)
1373 return -EPERM; 1364 return -EPERM;
1374 1365
1375 fuse_copy_init(&cs, fc, 1, iov, nr_segs); 1366 if (!iter_is_iovec(to))
1367 return -EINVAL;
1376 1368
1377 return fuse_dev_do_read(fc, file, &cs, iov_length(iov, nr_segs)); 1369 fuse_copy_init(&cs, fc, 1, to);
1370
1371 return fuse_dev_do_read(fc, file, &cs, iov_iter_count(to));
1378} 1372}
1379 1373
1380static ssize_t fuse_dev_splice_read(struct file *in, loff_t *ppos, 1374static ssize_t fuse_dev_splice_read(struct file *in, loff_t *ppos,
@@ -1394,7 +1388,7 @@ static ssize_t fuse_dev_splice_read(struct file *in, loff_t *ppos,
1394 if (!bufs) 1388 if (!bufs)
1395 return -ENOMEM; 1389 return -ENOMEM;
1396 1390
1397 fuse_copy_init(&cs, fc, 1, NULL, 0); 1391 fuse_copy_init(&cs, fc, 1, NULL);
1398 cs.pipebufs = bufs; 1392 cs.pipebufs = bufs;
1399 cs.pipe = pipe; 1393 cs.pipe = pipe;
1400 ret = fuse_dev_do_read(fc, in, &cs, len); 1394 ret = fuse_dev_do_read(fc, in, &cs, len);
@@ -1970,17 +1964,19 @@ static ssize_t fuse_dev_do_write(struct fuse_conn *fc,
1970 return err; 1964 return err;
1971} 1965}
1972 1966
1973static ssize_t fuse_dev_write(struct kiocb *iocb, const struct iovec *iov, 1967static ssize_t fuse_dev_write(struct kiocb *iocb, struct iov_iter *from)
1974 unsigned long nr_segs, loff_t pos)
1975{ 1968{
1976 struct fuse_copy_state cs; 1969 struct fuse_copy_state cs;
1977 struct fuse_conn *fc = fuse_get_conn(iocb->ki_filp); 1970 struct fuse_conn *fc = fuse_get_conn(iocb->ki_filp);
1978 if (!fc) 1971 if (!fc)
1979 return -EPERM; 1972 return -EPERM;
1980 1973
1981 fuse_copy_init(&cs, fc, 0, iov, nr_segs); 1974 if (!iter_is_iovec(from))
1975 return -EINVAL;
1976
1977 fuse_copy_init(&cs, fc, 0, from);
1982 1978
1983 return fuse_dev_do_write(fc, &cs, iov_length(iov, nr_segs)); 1979 return fuse_dev_do_write(fc, &cs, iov_iter_count(from));
1984} 1980}
1985 1981
1986static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe, 1982static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe,
@@ -2043,8 +2039,9 @@ static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe,
2043 } 2039 }
2044 pipe_unlock(pipe); 2040 pipe_unlock(pipe);
2045 2041
2046 fuse_copy_init(&cs, fc, 0, NULL, nbuf); 2042 fuse_copy_init(&cs, fc, 0, NULL);
2047 cs.pipebufs = bufs; 2043 cs.pipebufs = bufs;
2044 cs.nr_segs = nbuf;
2048 cs.pipe = pipe; 2045 cs.pipe = pipe;
2049 2046
2050 if (flags & SPLICE_F_MOVE) 2047 if (flags & SPLICE_F_MOVE)
@@ -2232,11 +2229,9 @@ const struct file_operations fuse_dev_operations = {
2232 .owner = THIS_MODULE, 2229 .owner = THIS_MODULE,
2233 .open = fuse_dev_open, 2230 .open = fuse_dev_open,
2234 .llseek = no_llseek, 2231 .llseek = no_llseek,
2235 .read = do_sync_read, 2232 .read_iter = fuse_dev_read,
2236 .aio_read = fuse_dev_read,
2237 .splice_read = fuse_dev_splice_read, 2233 .splice_read = fuse_dev_splice_read,
2238 .write = do_sync_write, 2234 .write_iter = fuse_dev_write,
2239 .aio_write = fuse_dev_write,
2240 .splice_write = fuse_dev_splice_write, 2235 .splice_write = fuse_dev_splice_write,
2241 .poll = fuse_dev_poll, 2236 .poll = fuse_dev_poll,
2242 .release = fuse_dev_release, 2237 .release = fuse_dev_release,
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index ff102cbf16ea..e1afdd7abf90 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -1401,55 +1401,33 @@ static ssize_t __fuse_direct_read(struct fuse_io_priv *io,
1401 return res; 1401 return res;
1402} 1402}
1403 1403
1404static ssize_t fuse_direct_read(struct file *file, char __user *buf, 1404static ssize_t fuse_direct_read_iter(struct kiocb *iocb, struct iov_iter *to)
1405 size_t count, loff_t *ppos)
1406{ 1405{
1407 struct fuse_io_priv io = { .async = 0, .file = file }; 1406 struct fuse_io_priv io = { .async = 0, .file = iocb->ki_filp };
1408 struct iovec iov = { .iov_base = buf, .iov_len = count }; 1407 return __fuse_direct_read(&io, to, &iocb->ki_pos);
1409 struct iov_iter ii;
1410 iov_iter_init(&ii, READ, &iov, 1, count);
1411 return __fuse_direct_read(&io, &ii, ppos);
1412} 1408}
1413 1409
1414static ssize_t __fuse_direct_write(struct fuse_io_priv *io, 1410static ssize_t fuse_direct_write_iter(struct kiocb *iocb, struct iov_iter *from)
1415 struct iov_iter *iter,
1416 loff_t *ppos)
1417{ 1411{
1418 struct file *file = io->file; 1412 struct file *file = iocb->ki_filp;
1419 struct inode *inode = file_inode(file);
1420 size_t count = iov_iter_count(iter);
1421 ssize_t res;
1422
1423
1424 res = generic_write_checks(file, ppos, &count, 0);
1425 if (!res) {
1426 iov_iter_truncate(iter, count);
1427 res = fuse_direct_io(io, iter, ppos, FUSE_DIO_WRITE);
1428 }
1429
1430 fuse_invalidate_attr(inode);
1431
1432 return res;
1433}
1434
1435static ssize_t fuse_direct_write(struct file *file, const char __user *buf,
1436 size_t count, loff_t *ppos)
1437{
1438 struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = count };
1439 struct inode *inode = file_inode(file); 1413 struct inode *inode = file_inode(file);
1440 ssize_t res;
1441 struct fuse_io_priv io = { .async = 0, .file = file }; 1414 struct fuse_io_priv io = { .async = 0, .file = file };
1442 struct iov_iter ii; 1415 size_t count = iov_iter_count(from);
1443 iov_iter_init(&ii, WRITE, &iov, 1, count); 1416 ssize_t res;
1444 1417
1445 if (is_bad_inode(inode)) 1418 if (is_bad_inode(inode))
1446 return -EIO; 1419 return -EIO;
1447 1420
1448 /* Don't allow parallel writes to the same file */ 1421 /* Don't allow parallel writes to the same file */
1449 mutex_lock(&inode->i_mutex); 1422 mutex_lock(&inode->i_mutex);
1450 res = __fuse_direct_write(&io, &ii, ppos); 1423 res = generic_write_checks(file, &iocb->ki_pos, &count, 0);
1424 if (!res) {
1425 iov_iter_truncate(from, count);
1426 res = fuse_direct_io(&io, from, &iocb->ki_pos, FUSE_DIO_WRITE);
1427 }
1428 fuse_invalidate_attr(inode);
1451 if (res > 0) 1429 if (res > 0)
1452 fuse_write_update_size(inode, *ppos); 1430 fuse_write_update_size(inode, iocb->ki_pos);
1453 mutex_unlock(&inode->i_mutex); 1431 mutex_unlock(&inode->i_mutex);
1454 1432
1455 return res; 1433 return res;
@@ -2862,10 +2840,17 @@ fuse_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter,
2862 if (io->async && is_sync_kiocb(iocb)) 2840 if (io->async && is_sync_kiocb(iocb))
2863 io->done = &wait; 2841 io->done = &wait;
2864 2842
2865 if (rw == WRITE) 2843 if (rw == WRITE) {
2866 ret = __fuse_direct_write(io, iter, &pos); 2844 ret = generic_write_checks(file, &pos, &count, 0);
2867 else 2845 if (!ret) {
2846 iov_iter_truncate(iter, count);
2847 ret = fuse_direct_io(io, iter, &pos, FUSE_DIO_WRITE);
2848 }
2849
2850 fuse_invalidate_attr(inode);
2851 } else {
2868 ret = __fuse_direct_read(io, iter, &pos); 2852 ret = __fuse_direct_read(io, iter, &pos);
2853 }
2869 2854
2870 if (io->async) { 2855 if (io->async) {
2871 fuse_aio_complete(io, ret < 0 ? ret : 0, -1); 2856 fuse_aio_complete(io, ret < 0 ? ret : 0, -1);
@@ -2968,9 +2953,7 @@ out:
2968 2953
2969static const struct file_operations fuse_file_operations = { 2954static const struct file_operations fuse_file_operations = {
2970 .llseek = fuse_file_llseek, 2955 .llseek = fuse_file_llseek,
2971 .read = new_sync_read,
2972 .read_iter = fuse_file_read_iter, 2956 .read_iter = fuse_file_read_iter,
2973 .write = new_sync_write,
2974 .write_iter = fuse_file_write_iter, 2957 .write_iter = fuse_file_write_iter,
2975 .mmap = fuse_file_mmap, 2958 .mmap = fuse_file_mmap,
2976 .open = fuse_open, 2959 .open = fuse_open,
@@ -2988,8 +2971,8 @@ static const struct file_operations fuse_file_operations = {
2988 2971
2989static const struct file_operations fuse_direct_io_file_operations = { 2972static const struct file_operations fuse_direct_io_file_operations = {
2990 .llseek = fuse_file_llseek, 2973 .llseek = fuse_file_llseek,
2991 .read = fuse_direct_read, 2974 .read_iter = fuse_direct_read_iter,
2992 .write = fuse_direct_write, 2975 .write_iter = fuse_direct_write_iter,
2993 .mmap = fuse_direct_mmap, 2976 .mmap = fuse_direct_mmap,
2994 .open = fuse_open, 2977 .open = fuse_open,
2995 .flush = fuse_flush, 2978 .flush = fuse_flush,
diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c
index 8ec43ab5babf..207eb4a8135e 100644
--- a/fs/gfs2/file.c
+++ b/fs/gfs2/file.c
@@ -1105,9 +1105,7 @@ static int gfs2_flock(struct file *file, int cmd, struct file_lock *fl)
1105 1105
1106const struct file_operations gfs2_file_fops = { 1106const struct file_operations gfs2_file_fops = {
1107 .llseek = gfs2_llseek, 1107 .llseek = gfs2_llseek,
1108 .read = new_sync_read,
1109 .read_iter = generic_file_read_iter, 1108 .read_iter = generic_file_read_iter,
1110 .write = new_sync_write,
1111 .write_iter = gfs2_file_write_iter, 1109 .write_iter = gfs2_file_write_iter,
1112 .unlocked_ioctl = gfs2_ioctl, 1110 .unlocked_ioctl = gfs2_ioctl,
1113 .mmap = gfs2_mmap, 1111 .mmap = gfs2_mmap,
@@ -1137,9 +1135,7 @@ const struct file_operations gfs2_dir_fops = {
1137 1135
1138const struct file_operations gfs2_file_fops_nolock = { 1136const struct file_operations gfs2_file_fops_nolock = {
1139 .llseek = gfs2_llseek, 1137 .llseek = gfs2_llseek,
1140 .read = new_sync_read,
1141 .read_iter = generic_file_read_iter, 1138 .read_iter = generic_file_read_iter,
1142 .write = new_sync_write,
1143 .write_iter = gfs2_file_write_iter, 1139 .write_iter = gfs2_file_write_iter,
1144 .unlocked_ioctl = gfs2_ioctl, 1140 .unlocked_ioctl = gfs2_ioctl,
1145 .mmap = gfs2_mmap, 1141 .mmap = gfs2_mmap,
diff --git a/fs/hfs/inode.c b/fs/hfs/inode.c
index 98d4ea45bb70..9337065bcc67 100644
--- a/fs/hfs/inode.c
+++ b/fs/hfs/inode.c
@@ -674,9 +674,7 @@ static int hfs_file_fsync(struct file *filp, loff_t start, loff_t end,
674 674
675static const struct file_operations hfs_file_operations = { 675static const struct file_operations hfs_file_operations = {
676 .llseek = generic_file_llseek, 676 .llseek = generic_file_llseek,
677 .read = new_sync_read,
678 .read_iter = generic_file_read_iter, 677 .read_iter = generic_file_read_iter,
679 .write = new_sync_write,
680 .write_iter = generic_file_write_iter, 678 .write_iter = generic_file_write_iter,
681 .mmap = generic_file_mmap, 679 .mmap = generic_file_mmap,
682 .splice_read = generic_file_splice_read, 680 .splice_read = generic_file_splice_read,
diff --git a/fs/hfsplus/inode.c b/fs/hfsplus/inode.c
index f541196d4ee9..5f86cadb0542 100644
--- a/fs/hfsplus/inode.c
+++ b/fs/hfsplus/inode.c
@@ -341,9 +341,7 @@ static const struct inode_operations hfsplus_file_inode_operations = {
341 341
342static const struct file_operations hfsplus_file_operations = { 342static const struct file_operations hfsplus_file_operations = {
343 .llseek = generic_file_llseek, 343 .llseek = generic_file_llseek,
344 .read = new_sync_read,
345 .read_iter = generic_file_read_iter, 344 .read_iter = generic_file_read_iter,
346 .write = new_sync_write,
347 .write_iter = generic_file_write_iter, 345 .write_iter = generic_file_write_iter,
348 .mmap = generic_file_mmap, 346 .mmap = generic_file_mmap,
349 .splice_read = generic_file_splice_read, 347 .splice_read = generic_file_splice_read,
diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c
index fd62cae0fdcb..e021188ca110 100644
--- a/fs/hostfs/hostfs_kern.c
+++ b/fs/hostfs/hostfs_kern.c
@@ -378,11 +378,9 @@ static int hostfs_fsync(struct file *file, loff_t start, loff_t end,
378 378
379static const struct file_operations hostfs_file_fops = { 379static const struct file_operations hostfs_file_fops = {
380 .llseek = generic_file_llseek, 380 .llseek = generic_file_llseek,
381 .read = new_sync_read,
382 .splice_read = generic_file_splice_read, 381 .splice_read = generic_file_splice_read,
383 .read_iter = generic_file_read_iter, 382 .read_iter = generic_file_read_iter,
384 .write_iter = generic_file_write_iter, 383 .write_iter = generic_file_write_iter,
385 .write = new_sync_write,
386 .mmap = generic_file_mmap, 384 .mmap = generic_file_mmap,
387 .open = hostfs_file_open, 385 .open = hostfs_file_open,
388 .release = hostfs_file_release, 386 .release = hostfs_file_release,
diff --git a/fs/hpfs/file.c b/fs/hpfs/file.c
index 7f54e5f76cec..6d8cfe9b52d6 100644
--- a/fs/hpfs/file.c
+++ b/fs/hpfs/file.c
@@ -197,9 +197,7 @@ const struct address_space_operations hpfs_aops = {
197const struct file_operations hpfs_file_ops = 197const struct file_operations hpfs_file_ops =
198{ 198{
199 .llseek = generic_file_llseek, 199 .llseek = generic_file_llseek,
200 .read = new_sync_read,
201 .read_iter = generic_file_read_iter, 200 .read_iter = generic_file_read_iter,
202 .write = new_sync_write,
203 .write_iter = generic_file_write_iter, 201 .write_iter = generic_file_write_iter,
204 .mmap = generic_file_mmap, 202 .mmap = generic_file_mmap,
205 .release = hpfs_file_release, 203 .release = hpfs_file_release,
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
index db76cec3ce21..45e34908bdb5 100644
--- a/fs/hugetlbfs/inode.c
+++ b/fs/hugetlbfs/inode.c
@@ -34,6 +34,7 @@
34#include <linux/security.h> 34#include <linux/security.h>
35#include <linux/magic.h> 35#include <linux/magic.h>
36#include <linux/migrate.h> 36#include <linux/migrate.h>
37#include <linux/uio.h>
37 38
38#include <asm/uaccess.h> 39#include <asm/uaccess.h>
39 40
@@ -179,42 +180,33 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
179} 180}
180#endif 181#endif
181 182
182static int 183static size_t
183hugetlbfs_read_actor(struct page *page, unsigned long offset, 184hugetlbfs_read_actor(struct page *page, unsigned long offset,
184 char __user *buf, unsigned long count, 185 struct iov_iter *to, unsigned long size)
185 unsigned long size)
186{ 186{
187 char *kaddr; 187 size_t copied = 0;
188 unsigned long left, copied = 0;
189 int i, chunksize; 188 int i, chunksize;
190 189
191 if (size > count)
192 size = count;
193
194 /* Find which 4k chunk and offset with in that chunk */ 190 /* Find which 4k chunk and offset with in that chunk */
195 i = offset >> PAGE_CACHE_SHIFT; 191 i = offset >> PAGE_CACHE_SHIFT;
196 offset = offset & ~PAGE_CACHE_MASK; 192 offset = offset & ~PAGE_CACHE_MASK;
197 193
198 while (size) { 194 while (size) {
195 size_t n;
199 chunksize = PAGE_CACHE_SIZE; 196 chunksize = PAGE_CACHE_SIZE;
200 if (offset) 197 if (offset)
201 chunksize -= offset; 198 chunksize -= offset;
202 if (chunksize > size) 199 if (chunksize > size)
203 chunksize = size; 200 chunksize = size;
204 kaddr = kmap(&page[i]); 201 n = copy_page_to_iter(&page[i], offset, chunksize, to);
205 left = __copy_to_user(buf, kaddr + offset, chunksize); 202 copied += n;
206 kunmap(&page[i]); 203 if (n != chunksize)
207 if (left) { 204 return copied;
208 copied += (chunksize - left);
209 break;
210 }
211 offset = 0; 205 offset = 0;
212 size -= chunksize; 206 size -= chunksize;
213 buf += chunksize;
214 copied += chunksize;
215 i++; 207 i++;
216 } 208 }
217 return copied ? copied : -EFAULT; 209 return copied;
218} 210}
219 211
220/* 212/*
@@ -222,39 +214,34 @@ hugetlbfs_read_actor(struct page *page, unsigned long offset,
222 * data. Its *very* similar to do_generic_mapping_read(), we can't use that 214 * data. Its *very* similar to do_generic_mapping_read(), we can't use that
223 * since it has PAGE_CACHE_SIZE assumptions. 215 * since it has PAGE_CACHE_SIZE assumptions.
224 */ 216 */
225static ssize_t hugetlbfs_read(struct file *filp, char __user *buf, 217static ssize_t hugetlbfs_read_iter(struct kiocb *iocb, struct iov_iter *to)
226 size_t len, loff_t *ppos)
227{ 218{
228 struct hstate *h = hstate_file(filp); 219 struct file *file = iocb->ki_filp;
229 struct address_space *mapping = filp->f_mapping; 220 struct hstate *h = hstate_file(file);
221 struct address_space *mapping = file->f_mapping;
230 struct inode *inode = mapping->host; 222 struct inode *inode = mapping->host;
231 unsigned long index = *ppos >> huge_page_shift(h); 223 unsigned long index = iocb->ki_pos >> huge_page_shift(h);
232 unsigned long offset = *ppos & ~huge_page_mask(h); 224 unsigned long offset = iocb->ki_pos & ~huge_page_mask(h);
233 unsigned long end_index; 225 unsigned long end_index;
234 loff_t isize; 226 loff_t isize;
235 ssize_t retval = 0; 227 ssize_t retval = 0;
236 228
237 /* validate length */ 229 while (iov_iter_count(to)) {
238 if (len == 0)
239 goto out;
240
241 for (;;) {
242 struct page *page; 230 struct page *page;
243 unsigned long nr, ret; 231 size_t nr, copied;
244 int ra;
245 232
246 /* nr is the maximum number of bytes to copy from this page */ 233 /* nr is the maximum number of bytes to copy from this page */
247 nr = huge_page_size(h); 234 nr = huge_page_size(h);
248 isize = i_size_read(inode); 235 isize = i_size_read(inode);
249 if (!isize) 236 if (!isize)
250 goto out; 237 break;
251 end_index = (isize - 1) >> huge_page_shift(h); 238 end_index = (isize - 1) >> huge_page_shift(h);
252 if (index >= end_index) { 239 if (index > end_index)
253 if (index > end_index) 240 break;
254 goto out; 241 if (index == end_index) {
255 nr = ((isize - 1) & ~huge_page_mask(h)) + 1; 242 nr = ((isize - 1) & ~huge_page_mask(h)) + 1;
256 if (nr <= offset) 243 if (nr <= offset)
257 goto out; 244 break;
258 } 245 }
259 nr = nr - offset; 246 nr = nr - offset;
260 247
@@ -265,39 +252,27 @@ static ssize_t hugetlbfs_read(struct file *filp, char __user *buf,
265 * We have a HOLE, zero out the user-buffer for the 252 * We have a HOLE, zero out the user-buffer for the
266 * length of the hole or request. 253 * length of the hole or request.
267 */ 254 */
268 ret = len < nr ? len : nr; 255 copied = iov_iter_zero(nr, to);
269 if (clear_user(buf, ret))
270 ra = -EFAULT;
271 else
272 ra = 0;
273 } else { 256 } else {
274 unlock_page(page); 257 unlock_page(page);
275 258
276 /* 259 /*
277 * We have the page, copy it to user space buffer. 260 * We have the page, copy it to user space buffer.
278 */ 261 */
279 ra = hugetlbfs_read_actor(page, offset, buf, len, nr); 262 copied = hugetlbfs_read_actor(page, offset, to, nr);
280 ret = ra;
281 page_cache_release(page); 263 page_cache_release(page);
282 } 264 }
283 if (ra < 0) { 265 offset += copied;
284 if (retval == 0) 266 retval += copied;
285 retval = ra; 267 if (copied != nr && iov_iter_count(to)) {
286 goto out; 268 if (!retval)
269 retval = -EFAULT;
270 break;
287 } 271 }
288
289 offset += ret;
290 retval += ret;
291 len -= ret;
292 index += offset >> huge_page_shift(h); 272 index += offset >> huge_page_shift(h);
293 offset &= ~huge_page_mask(h); 273 offset &= ~huge_page_mask(h);
294
295 /* short read or no more work */
296 if ((ret != nr) || (len == 0))
297 break;
298 } 274 }
299out: 275 iocb->ki_pos = ((loff_t)index << huge_page_shift(h)) + offset;
300 *ppos = ((loff_t)index << huge_page_shift(h)) + offset;
301 return retval; 276 return retval;
302} 277}
303 278
@@ -721,7 +696,7 @@ static void init_once(void *foo)
721} 696}
722 697
723const struct file_operations hugetlbfs_file_operations = { 698const struct file_operations hugetlbfs_file_operations = {
724 .read = hugetlbfs_read, 699 .read_iter = hugetlbfs_read_iter,
725 .mmap = hugetlbfs_file_mmap, 700 .mmap = hugetlbfs_file_mmap,
726 .fsync = noop_fsync, 701 .fsync = noop_fsync,
727 .get_unmapped_area = hugetlb_get_unmapped_area, 702 .get_unmapped_area = hugetlb_get_unmapped_area,
diff --git a/fs/jffs2/file.c b/fs/jffs2/file.c
index 64989ca9ba90..f509f62e12f6 100644
--- a/fs/jffs2/file.c
+++ b/fs/jffs2/file.c
@@ -51,9 +51,7 @@ const struct file_operations jffs2_file_operations =
51{ 51{
52 .llseek = generic_file_llseek, 52 .llseek = generic_file_llseek,
53 .open = generic_file_open, 53 .open = generic_file_open,
54 .read = new_sync_read,
55 .read_iter = generic_file_read_iter, 54 .read_iter = generic_file_read_iter,
56 .write = new_sync_write,
57 .write_iter = generic_file_write_iter, 55 .write_iter = generic_file_write_iter,
58 .unlocked_ioctl=jffs2_ioctl, 56 .unlocked_ioctl=jffs2_ioctl,
59 .mmap = generic_file_readonly_mmap, 57 .mmap = generic_file_readonly_mmap,
diff --git a/fs/jfs/file.c b/fs/jfs/file.c
index 10815f8dfd8b..ae46788b9723 100644
--- a/fs/jfs/file.c
+++ b/fs/jfs/file.c
@@ -151,8 +151,6 @@ const struct inode_operations jfs_file_inode_operations = {
151const struct file_operations jfs_file_operations = { 151const struct file_operations jfs_file_operations = {
152 .open = jfs_open, 152 .open = jfs_open,
153 .llseek = generic_file_llseek, 153 .llseek = generic_file_llseek,
154 .write = new_sync_write,
155 .read = new_sync_read,
156 .read_iter = generic_file_read_iter, 154 .read_iter = generic_file_read_iter,
157 .write_iter = generic_file_write_iter, 155 .write_iter = generic_file_write_iter,
158 .mmap = generic_file_mmap, 156 .mmap = generic_file_mmap,
diff --git a/fs/logfs/file.c b/fs/logfs/file.c
index 8538752df2f6..b2c13f739ffa 100644
--- a/fs/logfs/file.c
+++ b/fs/logfs/file.c
@@ -271,8 +271,6 @@ const struct file_operations logfs_reg_fops = {
271 .llseek = generic_file_llseek, 271 .llseek = generic_file_llseek,
272 .mmap = generic_file_readonly_mmap, 272 .mmap = generic_file_readonly_mmap,
273 .open = generic_file_open, 273 .open = generic_file_open,
274 .read = new_sync_read,
275 .write = new_sync_write,
276}; 274};
277 275
278const struct address_space_operations logfs_reg_aops = { 276const struct address_space_operations logfs_reg_aops = {
diff --git a/fs/minix/file.c b/fs/minix/file.c
index a967de085ac0..6d63e27ec961 100644
--- a/fs/minix/file.c
+++ b/fs/minix/file.c
@@ -14,9 +14,7 @@
14 */ 14 */
15const struct file_operations minix_file_operations = { 15const struct file_operations minix_file_operations = {
16 .llseek = generic_file_llseek, 16 .llseek = generic_file_llseek,
17 .read = new_sync_read,
18 .read_iter = generic_file_read_iter, 17 .read_iter = generic_file_read_iter,
19 .write = new_sync_write,
20 .write_iter = generic_file_write_iter, 18 .write_iter = generic_file_write_iter,
21 .mmap = generic_file_mmap, 19 .mmap = generic_file_mmap,
22 .fsync = generic_file_fsync, 20 .fsync = generic_file_fsync,
diff --git a/fs/ncpfs/file.c b/fs/ncpfs/file.c
index 1dd7007f974d..479bf8db264e 100644
--- a/fs/ncpfs/file.c
+++ b/fs/ncpfs/file.c
@@ -98,30 +98,24 @@ out:
98} 98}
99 99
100static ssize_t 100static ssize_t
101ncp_file_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) 101ncp_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
102{ 102{
103 struct file *file = iocb->ki_filp;
103 struct inode *inode = file_inode(file); 104 struct inode *inode = file_inode(file);
104 size_t already_read = 0; 105 size_t already_read = 0;
105 off_t pos; 106 off_t pos = iocb->ki_pos;
106 size_t bufsize; 107 size_t bufsize;
107 int error; 108 int error;
108 void* freepage; 109 void *freepage;
109 size_t freelen; 110 size_t freelen;
110 111
111 ncp_dbg(1, "enter %pD2\n", file); 112 ncp_dbg(1, "enter %pD2\n", file);
112 113
113 pos = *ppos; 114 if (!iov_iter_count(to))
114
115 if ((ssize_t) count < 0) {
116 return -EINVAL;
117 }
118 if (!count)
119 return 0; 115 return 0;
120 if (pos > inode->i_sb->s_maxbytes) 116 if (pos > inode->i_sb->s_maxbytes)
121 return 0; 117 return 0;
122 if (pos + count > inode->i_sb->s_maxbytes) { 118 iov_iter_truncate(to, inode->i_sb->s_maxbytes - pos);
123 count = inode->i_sb->s_maxbytes - pos;
124 }
125 119
126 error = ncp_make_open(inode, O_RDONLY); 120 error = ncp_make_open(inode, O_RDONLY);
127 if (error) { 121 if (error) {
@@ -138,31 +132,29 @@ ncp_file_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
138 goto outrel; 132 goto outrel;
139 error = 0; 133 error = 0;
140 /* First read in as much as possible for each bufsize. */ 134 /* First read in as much as possible for each bufsize. */
141 while (already_read < count) { 135 while (iov_iter_count(to)) {
142 int read_this_time; 136 int read_this_time;
143 size_t to_read = min_t(unsigned int, 137 size_t to_read = min_t(size_t,
144 bufsize - (pos % bufsize), 138 bufsize - (pos % bufsize),
145 count - already_read); 139 iov_iter_count(to));
146 140
147 error = ncp_read_bounce(NCP_SERVER(inode), 141 error = ncp_read_bounce(NCP_SERVER(inode),
148 NCP_FINFO(inode)->file_handle, 142 NCP_FINFO(inode)->file_handle,
149 pos, to_read, buf, &read_this_time, 143 pos, to_read, to, &read_this_time,
150 freepage, freelen); 144 freepage, freelen);
151 if (error) { 145 if (error) {
152 error = -EIO; /* NW errno -> Linux errno */ 146 error = -EIO; /* NW errno -> Linux errno */
153 break; 147 break;
154 } 148 }
155 pos += read_this_time; 149 pos += read_this_time;
156 buf += read_this_time;
157 already_read += read_this_time; 150 already_read += read_this_time;
158 151
159 if (read_this_time != to_read) { 152 if (read_this_time != to_read)
160 break; 153 break;
161 }
162 } 154 }
163 vfree(freepage); 155 vfree(freepage);
164 156
165 *ppos = pos; 157 iocb->ki_pos = pos;
166 158
167 file_accessed(file); 159 file_accessed(file);
168 160
@@ -173,42 +165,26 @@ outrel:
173} 165}
174 166
175static ssize_t 167static ssize_t
176ncp_file_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) 168ncp_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
177{ 169{
170 struct file *file = iocb->ki_filp;
178 struct inode *inode = file_inode(file); 171 struct inode *inode = file_inode(file);
179 size_t already_written = 0; 172 size_t already_written = 0;
180 off_t pos; 173 loff_t pos = iocb->ki_pos;
174 size_t count = iov_iter_count(from);
181 size_t bufsize; 175 size_t bufsize;
182 int errno; 176 int errno;
183 void* bouncebuffer; 177 void *bouncebuffer;
184 178
185 ncp_dbg(1, "enter %pD2\n", file); 179 ncp_dbg(1, "enter %pD2\n", file);
186 if ((ssize_t) count < 0) 180 errno = generic_write_checks(file, &pos, &count, 0);
187 return -EINVAL; 181 if (errno)
188 pos = *ppos; 182 return errno;
189 if (file->f_flags & O_APPEND) { 183 iov_iter_truncate(from, count);
190 pos = i_size_read(inode);
191 }
192
193 if (pos + count > MAX_NON_LFS && !(file->f_flags&O_LARGEFILE)) {
194 if (pos >= MAX_NON_LFS) {
195 return -EFBIG;
196 }
197 if (count > MAX_NON_LFS - (u32)pos) {
198 count = MAX_NON_LFS - (u32)pos;
199 }
200 }
201 if (pos >= inode->i_sb->s_maxbytes) {
202 if (count || pos > inode->i_sb->s_maxbytes) {
203 return -EFBIG;
204 }
205 }
206 if (pos + count > inode->i_sb->s_maxbytes) {
207 count = inode->i_sb->s_maxbytes - pos;
208 }
209 184
210 if (!count) 185 if (!count)
211 return 0; 186 return 0;
187
212 errno = ncp_make_open(inode, O_WRONLY); 188 errno = ncp_make_open(inode, O_WRONLY);
213 if (errno) { 189 if (errno) {
214 ncp_dbg(1, "open failed, error=%d\n", errno); 190 ncp_dbg(1, "open failed, error=%d\n", errno);
@@ -216,8 +192,6 @@ ncp_file_write(struct file *file, const char __user *buf, size_t count, loff_t *
216 } 192 }
217 bufsize = NCP_SERVER(inode)->buffer_size; 193 bufsize = NCP_SERVER(inode)->buffer_size;
218 194
219 already_written = 0;
220
221 errno = file_update_time(file); 195 errno = file_update_time(file);
222 if (errno) 196 if (errno)
223 goto outrel; 197 goto outrel;
@@ -227,13 +201,13 @@ ncp_file_write(struct file *file, const char __user *buf, size_t count, loff_t *
227 errno = -EIO; /* -ENOMEM */ 201 errno = -EIO; /* -ENOMEM */
228 goto outrel; 202 goto outrel;
229 } 203 }
230 while (already_written < count) { 204 while (iov_iter_count(from)) {
231 int written_this_time; 205 int written_this_time;
232 size_t to_write = min_t(unsigned int, 206 size_t to_write = min_t(size_t,
233 bufsize - (pos % bufsize), 207 bufsize - ((off_t)pos % bufsize),
234 count - already_written); 208 iov_iter_count(from));
235 209
236 if (copy_from_user(bouncebuffer, buf, to_write)) { 210 if (copy_from_iter(bouncebuffer, to_write, from) != to_write) {
237 errno = -EFAULT; 211 errno = -EFAULT;
238 break; 212 break;
239 } 213 }
@@ -244,16 +218,14 @@ ncp_file_write(struct file *file, const char __user *buf, size_t count, loff_t *
244 break; 218 break;
245 } 219 }
246 pos += written_this_time; 220 pos += written_this_time;
247 buf += written_this_time;
248 already_written += written_this_time; 221 already_written += written_this_time;
249 222
250 if (written_this_time != to_write) { 223 if (written_this_time != to_write)
251 break; 224 break;
252 }
253 } 225 }
254 vfree(bouncebuffer); 226 vfree(bouncebuffer);
255 227
256 *ppos = pos; 228 iocb->ki_pos = pos;
257 229
258 if (pos > i_size_read(inode)) { 230 if (pos > i_size_read(inode)) {
259 mutex_lock(&inode->i_mutex); 231 mutex_lock(&inode->i_mutex);
@@ -277,8 +249,8 @@ static int ncp_release(struct inode *inode, struct file *file) {
277const struct file_operations ncp_file_operations = 249const struct file_operations ncp_file_operations =
278{ 250{
279 .llseek = generic_file_llseek, 251 .llseek = generic_file_llseek,
280 .read = ncp_file_read, 252 .read_iter = ncp_file_read_iter,
281 .write = ncp_file_write, 253 .write_iter = ncp_file_write_iter,
282 .unlocked_ioctl = ncp_ioctl, 254 .unlocked_ioctl = ncp_ioctl,
283#ifdef CONFIG_COMPAT 255#ifdef CONFIG_COMPAT
284 .compat_ioctl = ncp_compat_ioctl, 256 .compat_ioctl = ncp_compat_ioctl,
diff --git a/fs/ncpfs/ncplib_kernel.c b/fs/ncpfs/ncplib_kernel.c
index 482387532f54..2b502a0d7941 100644
--- a/fs/ncpfs/ncplib_kernel.c
+++ b/fs/ncpfs/ncplib_kernel.c
@@ -1001,8 +1001,8 @@ out:
1001 */ 1001 */
1002int 1002int
1003ncp_read_bounce(struct ncp_server *server, const char *file_id, 1003ncp_read_bounce(struct ncp_server *server, const char *file_id,
1004 __u32 offset, __u16 to_read, char __user *target, int *bytes_read, 1004 __u32 offset, __u16 to_read, struct iov_iter *to,
1005 void* bounce, __u32 bufsize) 1005 int *bytes_read, void *bounce, __u32 bufsize)
1006{ 1006{
1007 int result; 1007 int result;
1008 1008
@@ -1025,7 +1025,7 @@ ncp_read_bounce(struct ncp_server *server, const char *file_id,
1025 (offset & 1); 1025 (offset & 1);
1026 *bytes_read = len; 1026 *bytes_read = len;
1027 result = 0; 1027 result = 0;
1028 if (copy_to_user(target, source, len)) 1028 if (copy_to_iter(source, len, to) != len)
1029 result = -EFAULT; 1029 result = -EFAULT;
1030 } 1030 }
1031 } 1031 }
diff --git a/fs/ncpfs/ncplib_kernel.h b/fs/ncpfs/ncplib_kernel.h
index 250e443a07f3..5233fbc1747a 100644
--- a/fs/ncpfs/ncplib_kernel.h
+++ b/fs/ncpfs/ncplib_kernel.h
@@ -53,7 +53,7 @@ static inline int ncp_read_bounce_size(__u32 size) {
53 return sizeof(struct ncp_reply_header) + 2 + 2 + size + 8; 53 return sizeof(struct ncp_reply_header) + 2 + 2 + size + 8;
54}; 54};
55int ncp_read_bounce(struct ncp_server *, const char *, __u32, __u16, 55int ncp_read_bounce(struct ncp_server *, const char *, __u32, __u16,
56 char __user *, int *, void* bounce, __u32 bouncelen); 56 struct iov_iter *, int *, void *bounce, __u32 bouncelen);
57int ncp_read_kernel(struct ncp_server *, const char *, __u32, __u16, 57int ncp_read_kernel(struct ncp_server *, const char *, __u32, __u16,
58 char *, int *); 58 char *, int *);
59int ncp_write_kernel(struct ncp_server *, const char *, __u32, __u16, 59int ncp_write_kernel(struct ncp_server *, const char *, __u32, __u16,
diff --git a/fs/nfs/file.c b/fs/nfs/file.c
index 37b15582e0de..f6a3adedf027 100644
--- a/fs/nfs/file.c
+++ b/fs/nfs/file.c
@@ -926,8 +926,6 @@ EXPORT_SYMBOL_GPL(nfs_flock);
926 926
927const struct file_operations nfs_file_operations = { 927const struct file_operations nfs_file_operations = {
928 .llseek = nfs_file_llseek, 928 .llseek = nfs_file_llseek,
929 .read = new_sync_read,
930 .write = new_sync_write,
931 .read_iter = nfs_file_read, 929 .read_iter = nfs_file_read,
932 .write_iter = nfs_file_write, 930 .write_iter = nfs_file_write,
933 .mmap = nfs_file_mmap, 931 .mmap = nfs_file_mmap,
diff --git a/fs/nfs/nfs4file.c b/fs/nfs/nfs4file.c
index 8b46389c4c5b..0181cde1d102 100644
--- a/fs/nfs/nfs4file.c
+++ b/fs/nfs/nfs4file.c
@@ -170,8 +170,6 @@ const struct file_operations nfs4_file_operations = {
170#else 170#else
171 .llseek = nfs_file_llseek, 171 .llseek = nfs_file_llseek,
172#endif 172#endif
173 .read = new_sync_read,
174 .write = new_sync_write,
175 .read_iter = nfs_file_read, 173 .read_iter = nfs_file_read,
176 .write_iter = nfs_file_write, 174 .write_iter = nfs_file_write,
177 .mmap = nfs_file_mmap, 175 .mmap = nfs_file_mmap,
diff --git a/fs/nilfs2/file.c b/fs/nilfs2/file.c
index a8c728acb7a8..54575e3cc1a2 100644
--- a/fs/nilfs2/file.c
+++ b/fs/nilfs2/file.c
@@ -143,8 +143,6 @@ static int nilfs_file_mmap(struct file *file, struct vm_area_struct *vma)
143 */ 143 */
144const struct file_operations nilfs_file_operations = { 144const struct file_operations nilfs_file_operations = {
145 .llseek = generic_file_llseek, 145 .llseek = generic_file_llseek,
146 .read = new_sync_read,
147 .write = new_sync_write,
148 .read_iter = generic_file_read_iter, 146 .read_iter = generic_file_read_iter,
149 .write_iter = generic_file_write_iter, 147 .write_iter = generic_file_write_iter,
150 .unlocked_ioctl = nilfs_ioctl, 148 .unlocked_ioctl = nilfs_ioctl,
diff --git a/fs/ntfs/file.c b/fs/ntfs/file.c
index c1da78dad1af..840e95e3f1d2 100644
--- a/fs/ntfs/file.c
+++ b/fs/ntfs/file.c
@@ -2048,10 +2048,8 @@ static int ntfs_file_fsync(struct file *filp, loff_t start, loff_t end,
2048 2048
2049const struct file_operations ntfs_file_ops = { 2049const struct file_operations ntfs_file_ops = {
2050 .llseek = generic_file_llseek, 2050 .llseek = generic_file_llseek,
2051 .read = new_sync_read,
2052 .read_iter = generic_file_read_iter, 2051 .read_iter = generic_file_read_iter,
2053#ifdef NTFS_RW 2052#ifdef NTFS_RW
2054 .write = new_sync_write,
2055 .write_iter = ntfs_file_write_iter, 2053 .write_iter = ntfs_file_write_iter,
2056 .fsync = ntfs_file_fsync, 2054 .fsync = ntfs_file_fsync,
2057#endif /* NTFS_RW */ 2055#endif /* NTFS_RW */
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
index 91f03ce98108..8c48e989beba 100644
--- a/fs/ocfs2/file.c
+++ b/fs/ocfs2/file.c
@@ -2681,8 +2681,6 @@ const struct inode_operations ocfs2_special_file_iops = {
2681 */ 2681 */
2682const struct file_operations ocfs2_fops = { 2682const struct file_operations ocfs2_fops = {
2683 .llseek = ocfs2_file_llseek, 2683 .llseek = ocfs2_file_llseek,
2684 .read = new_sync_read,
2685 .write = new_sync_write,
2686 .mmap = ocfs2_mmap, 2684 .mmap = ocfs2_mmap,
2687 .fsync = ocfs2_sync_file, 2685 .fsync = ocfs2_sync_file,
2688 .release = ocfs2_file_release, 2686 .release = ocfs2_file_release,
@@ -2729,8 +2727,6 @@ const struct file_operations ocfs2_dops = {
2729 */ 2727 */
2730const struct file_operations ocfs2_fops_no_plocks = { 2728const struct file_operations ocfs2_fops_no_plocks = {
2731 .llseek = ocfs2_file_llseek, 2729 .llseek = ocfs2_file_llseek,
2732 .read = new_sync_read,
2733 .write = new_sync_write,
2734 .mmap = ocfs2_mmap, 2730 .mmap = ocfs2_mmap,
2735 .fsync = ocfs2_sync_file, 2731 .fsync = ocfs2_sync_file,
2736 .release = ocfs2_file_release, 2732 .release = ocfs2_file_release,
diff --git a/fs/omfs/file.c b/fs/omfs/file.c
index 902e88527fce..f993be7f2156 100644
--- a/fs/omfs/file.c
+++ b/fs/omfs/file.c
@@ -337,8 +337,6 @@ static sector_t omfs_bmap(struct address_space *mapping, sector_t block)
337 337
338const struct file_operations omfs_file_operations = { 338const struct file_operations omfs_file_operations = {
339 .llseek = generic_file_llseek, 339 .llseek = generic_file_llseek,
340 .read = new_sync_read,
341 .write = new_sync_write,
342 .read_iter = generic_file_read_iter, 340 .read_iter = generic_file_read_iter,
343 .write_iter = generic_file_write_iter, 341 .write_iter = generic_file_write_iter,
344 .mmap = generic_file_mmap, 342 .mmap = generic_file_mmap,
diff --git a/fs/open.c b/fs/open.c
index 6a83c47d5904..6796f04d6032 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -734,10 +734,10 @@ static int do_dentry_open(struct file *f,
734 if ((f->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) 734 if ((f->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ)
735 i_readcount_inc(inode); 735 i_readcount_inc(inode);
736 if ((f->f_mode & FMODE_READ) && 736 if ((f->f_mode & FMODE_READ) &&
737 likely(f->f_op->read || f->f_op->aio_read || f->f_op->read_iter)) 737 likely(f->f_op->read || f->f_op->read_iter))
738 f->f_mode |= FMODE_CAN_READ; 738 f->f_mode |= FMODE_CAN_READ;
739 if ((f->f_mode & FMODE_WRITE) && 739 if ((f->f_mode & FMODE_WRITE) &&
740 likely(f->f_op->write || f->f_op->aio_write || f->f_op->write_iter)) 740 likely(f->f_op->write || f->f_op->write_iter))
741 f->f_mode |= FMODE_CAN_WRITE; 741 f->f_mode |= FMODE_CAN_WRITE;
742 742
743 f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC); 743 f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
diff --git a/fs/pipe.c b/fs/pipe.c
index 2d084f2d0b83..822da5b7cff0 100644
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -946,9 +946,7 @@ err:
946const struct file_operations pipefifo_fops = { 946const struct file_operations pipefifo_fops = {
947 .open = fifo_open, 947 .open = fifo_open,
948 .llseek = no_llseek, 948 .llseek = no_llseek,
949 .read = new_sync_read,
950 .read_iter = pipe_read, 949 .read_iter = pipe_read,
951 .write = new_sync_write,
952 .write_iter = pipe_write, 950 .write_iter = pipe_write,
953 .poll = pipe_poll, 951 .poll = pipe_poll,
954 .unlocked_ioctl = pipe_ioctl, 952 .unlocked_ioctl = pipe_ioctl,
diff --git a/fs/ramfs/file-mmu.c b/fs/ramfs/file-mmu.c
index 4f56de822d2f..183a212694bf 100644
--- a/fs/ramfs/file-mmu.c
+++ b/fs/ramfs/file-mmu.c
@@ -31,9 +31,7 @@
31#include "internal.h" 31#include "internal.h"
32 32
33const struct file_operations ramfs_file_operations = { 33const struct file_operations ramfs_file_operations = {
34 .read = new_sync_read,
35 .read_iter = generic_file_read_iter, 34 .read_iter = generic_file_read_iter,
36 .write = new_sync_write,
37 .write_iter = generic_file_write_iter, 35 .write_iter = generic_file_write_iter,
38 .mmap = generic_file_mmap, 36 .mmap = generic_file_mmap,
39 .fsync = noop_fsync, 37 .fsync = noop_fsync,
diff --git a/fs/ramfs/file-nommu.c b/fs/ramfs/file-nommu.c
index f6ab41b39612..0b38befa69f3 100644
--- a/fs/ramfs/file-nommu.c
+++ b/fs/ramfs/file-nommu.c
@@ -44,9 +44,7 @@ const struct file_operations ramfs_file_operations = {
44 .mmap_capabilities = ramfs_mmap_capabilities, 44 .mmap_capabilities = ramfs_mmap_capabilities,
45 .mmap = ramfs_nommu_mmap, 45 .mmap = ramfs_nommu_mmap,
46 .get_unmapped_area = ramfs_nommu_get_unmapped_area, 46 .get_unmapped_area = ramfs_nommu_get_unmapped_area,
47 .read = new_sync_read,
48 .read_iter = generic_file_read_iter, 47 .read_iter = generic_file_read_iter,
49 .write = new_sync_write,
50 .write_iter = generic_file_write_iter, 48 .write_iter = generic_file_write_iter,
51 .fsync = noop_fsync, 49 .fsync = noop_fsync,
52 .splice_read = generic_file_splice_read, 50 .splice_read = generic_file_splice_read,
diff --git a/fs/read_write.c b/fs/read_write.c
index 69128b378646..45d583c33879 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -22,13 +22,10 @@
22#include <asm/unistd.h> 22#include <asm/unistd.h>
23 23
24typedef ssize_t (*io_fn_t)(struct file *, char __user *, size_t, loff_t *); 24typedef ssize_t (*io_fn_t)(struct file *, char __user *, size_t, loff_t *);
25typedef ssize_t (*iov_fn_t)(struct kiocb *, const struct iovec *,
26 unsigned long, loff_t);
27typedef ssize_t (*iter_fn_t)(struct kiocb *, struct iov_iter *); 25typedef ssize_t (*iter_fn_t)(struct kiocb *, struct iov_iter *);
28 26
29const struct file_operations generic_ro_fops = { 27const struct file_operations generic_ro_fops = {
30 .llseek = generic_file_llseek, 28 .llseek = generic_file_llseek,
31 .read = new_sync_read,
32 .read_iter = generic_file_read_iter, 29 .read_iter = generic_file_read_iter,
33 .mmap = generic_file_readonly_mmap, 30 .mmap = generic_file_readonly_mmap,
34 .splice_read = generic_file_splice_read, 31 .splice_read = generic_file_splice_read,
@@ -411,24 +408,7 @@ int rw_verify_area(int read_write, struct file *file, const loff_t *ppos, size_t
411 return count > MAX_RW_COUNT ? MAX_RW_COUNT : count; 408 return count > MAX_RW_COUNT ? MAX_RW_COUNT : count;
412} 409}
413 410
414ssize_t do_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos) 411static ssize_t new_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos)
415{
416 struct iovec iov = { .iov_base = buf, .iov_len = len };
417 struct kiocb kiocb;
418 ssize_t ret;
419
420 init_sync_kiocb(&kiocb, filp);
421 kiocb.ki_pos = *ppos;
422
423 ret = filp->f_op->aio_read(&kiocb, &iov, 1, kiocb.ki_pos);
424 BUG_ON(ret == -EIOCBQUEUED);
425 *ppos = kiocb.ki_pos;
426 return ret;
427}
428
429EXPORT_SYMBOL(do_sync_read);
430
431ssize_t new_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos)
432{ 412{
433 struct iovec iov = { .iov_base = buf, .iov_len = len }; 413 struct iovec iov = { .iov_base = buf, .iov_len = len };
434 struct kiocb kiocb; 414 struct kiocb kiocb;
@@ -445,24 +425,17 @@ ssize_t new_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *p
445 return ret; 425 return ret;
446} 426}
447 427
448EXPORT_SYMBOL(new_sync_read);
449
450ssize_t __vfs_read(struct file *file, char __user *buf, size_t count, 428ssize_t __vfs_read(struct file *file, char __user *buf, size_t count,
451 loff_t *pos) 429 loff_t *pos)
452{ 430{
453 ssize_t ret;
454
455 if (file->f_op->read) 431 if (file->f_op->read)
456 ret = file->f_op->read(file, buf, count, pos); 432 return file->f_op->read(file, buf, count, pos);
457 else if (file->f_op->aio_read)
458 ret = do_sync_read(file, buf, count, pos);
459 else if (file->f_op->read_iter) 433 else if (file->f_op->read_iter)
460 ret = new_sync_read(file, buf, count, pos); 434 return new_sync_read(file, buf, count, pos);
461 else 435 else
462 ret = -EINVAL; 436 return -EINVAL;
463
464 return ret;
465} 437}
438EXPORT_SYMBOL(__vfs_read);
466 439
467ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos) 440ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
468{ 441{
@@ -491,24 +464,7 @@ ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
491 464
492EXPORT_SYMBOL(vfs_read); 465EXPORT_SYMBOL(vfs_read);
493 466
494ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos) 467static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos)
495{
496 struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = len };
497 struct kiocb kiocb;
498 ssize_t ret;
499
500 init_sync_kiocb(&kiocb, filp);
501 kiocb.ki_pos = *ppos;
502
503 ret = filp->f_op->aio_write(&kiocb, &iov, 1, kiocb.ki_pos);
504 BUG_ON(ret == -EIOCBQUEUED);
505 *ppos = kiocb.ki_pos;
506 return ret;
507}
508
509EXPORT_SYMBOL(do_sync_write);
510
511ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos)
512{ 468{
513 struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = len }; 469 struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = len };
514 struct kiocb kiocb; 470 struct kiocb kiocb;
@@ -525,7 +481,17 @@ ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, lo
525 return ret; 481 return ret;
526} 482}
527 483
528EXPORT_SYMBOL(new_sync_write); 484ssize_t __vfs_write(struct file *file, const char __user *p, size_t count,
485 loff_t *pos)
486{
487 if (file->f_op->write)
488 return file->f_op->write(file, p, count, pos);
489 else if (file->f_op->write_iter)
490 return new_sync_write(file, p, count, pos);
491 else
492 return -EINVAL;
493}
494EXPORT_SYMBOL(__vfs_write);
529 495
530ssize_t __kernel_write(struct file *file, const char *buf, size_t count, loff_t *pos) 496ssize_t __kernel_write(struct file *file, const char *buf, size_t count, loff_t *pos)
531{ 497{
@@ -541,12 +507,7 @@ ssize_t __kernel_write(struct file *file, const char *buf, size_t count, loff_t
541 p = (__force const char __user *)buf; 507 p = (__force const char __user *)buf;
542 if (count > MAX_RW_COUNT) 508 if (count > MAX_RW_COUNT)
543 count = MAX_RW_COUNT; 509 count = MAX_RW_COUNT;
544 if (file->f_op->write) 510 ret = __vfs_write(file, p, count, pos);
545 ret = file->f_op->write(file, p, count, pos);
546 else if (file->f_op->aio_write)
547 ret = do_sync_write(file, p, count, pos);
548 else
549 ret = new_sync_write(file, p, count, pos);
550 set_fs(old_fs); 511 set_fs(old_fs);
551 if (ret > 0) { 512 if (ret > 0) {
552 fsnotify_modify(file); 513 fsnotify_modify(file);
@@ -573,12 +534,7 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_
573 if (ret >= 0) { 534 if (ret >= 0) {
574 count = ret; 535 count = ret;
575 file_start_write(file); 536 file_start_write(file);
576 if (file->f_op->write) 537 ret = __vfs_write(file, buf, count, pos);
577 ret = file->f_op->write(file, buf, count, pos);
578 else if (file->f_op->aio_write)
579 ret = do_sync_write(file, buf, count, pos);
580 else
581 ret = new_sync_write(file, buf, count, pos);
582 if (ret > 0) { 538 if (ret > 0) {
583 fsnotify_modify(file); 539 fsnotify_modify(file);
584 add_wchar(current, ret); 540 add_wchar(current, ret);
@@ -710,21 +666,6 @@ static ssize_t do_iter_readv_writev(struct file *filp, struct iov_iter *iter,
710 return ret; 666 return ret;
711} 667}
712 668
713static ssize_t do_sync_readv_writev(struct file *filp, struct iov_iter *iter,
714 loff_t *ppos, iov_fn_t fn)
715{
716 struct kiocb kiocb;
717 ssize_t ret;
718
719 init_sync_kiocb(&kiocb, filp);
720 kiocb.ki_pos = *ppos;
721
722 ret = fn(&kiocb, iter->iov, iter->nr_segs, kiocb.ki_pos);
723 BUG_ON(ret == -EIOCBQUEUED);
724 *ppos = kiocb.ki_pos;
725 return ret;
726}
727
728/* Do it by hand, with file-ops */ 669/* Do it by hand, with file-ops */
729static ssize_t do_loop_readv_writev(struct file *filp, struct iov_iter *iter, 670static ssize_t do_loop_readv_writev(struct file *filp, struct iov_iter *iter,
730 loff_t *ppos, io_fn_t fn) 671 loff_t *ppos, io_fn_t fn)
@@ -839,7 +780,6 @@ static ssize_t do_readv_writev(int type, struct file *file,
839 struct iov_iter iter; 780 struct iov_iter iter;
840 ssize_t ret; 781 ssize_t ret;
841 io_fn_t fn; 782 io_fn_t fn;
842 iov_fn_t fnv;
843 iter_fn_t iter_fn; 783 iter_fn_t iter_fn;
844 784
845 ret = import_iovec(type, uvector, nr_segs, 785 ret = import_iovec(type, uvector, nr_segs,
@@ -854,22 +794,17 @@ static ssize_t do_readv_writev(int type, struct file *file,
854 if (ret < 0) 794 if (ret < 0)
855 goto out; 795 goto out;
856 796
857 fnv = NULL;
858 if (type == READ) { 797 if (type == READ) {
859 fn = file->f_op->read; 798 fn = file->f_op->read;
860 fnv = file->f_op->aio_read;
861 iter_fn = file->f_op->read_iter; 799 iter_fn = file->f_op->read_iter;
862 } else { 800 } else {
863 fn = (io_fn_t)file->f_op->write; 801 fn = (io_fn_t)file->f_op->write;
864 fnv = file->f_op->aio_write;
865 iter_fn = file->f_op->write_iter; 802 iter_fn = file->f_op->write_iter;
866 file_start_write(file); 803 file_start_write(file);
867 } 804 }
868 805
869 if (iter_fn) 806 if (iter_fn)
870 ret = do_iter_readv_writev(file, &iter, pos, iter_fn); 807 ret = do_iter_readv_writev(file, &iter, pos, iter_fn);
871 else if (fnv)
872 ret = do_sync_readv_writev(file, &iter, pos, fnv);
873 else 808 else
874 ret = do_loop_readv_writev(file, &iter, pos, fn); 809 ret = do_loop_readv_writev(file, &iter, pos, fn);
875 810
@@ -1019,7 +954,6 @@ static ssize_t compat_do_readv_writev(int type, struct file *file,
1019 struct iov_iter iter; 954 struct iov_iter iter;
1020 ssize_t ret; 955 ssize_t ret;
1021 io_fn_t fn; 956 io_fn_t fn;
1022 iov_fn_t fnv;
1023 iter_fn_t iter_fn; 957 iter_fn_t iter_fn;
1024 958
1025 ret = compat_import_iovec(type, uvector, nr_segs, 959 ret = compat_import_iovec(type, uvector, nr_segs,
@@ -1034,22 +968,17 @@ static ssize_t compat_do_readv_writev(int type, struct file *file,
1034 if (ret < 0) 968 if (ret < 0)
1035 goto out; 969 goto out;
1036 970
1037 fnv = NULL;
1038 if (type == READ) { 971 if (type == READ) {
1039 fn = file->f_op->read; 972 fn = file->f_op->read;
1040 fnv = file->f_op->aio_read;
1041 iter_fn = file->f_op->read_iter; 973 iter_fn = file->f_op->read_iter;
1042 } else { 974 } else {
1043 fn = (io_fn_t)file->f_op->write; 975 fn = (io_fn_t)file->f_op->write;
1044 fnv = file->f_op->aio_write;
1045 iter_fn = file->f_op->write_iter; 976 iter_fn = file->f_op->write_iter;
1046 file_start_write(file); 977 file_start_write(file);
1047 } 978 }
1048 979
1049 if (iter_fn) 980 if (iter_fn)
1050 ret = do_iter_readv_writev(file, &iter, pos, iter_fn); 981 ret = do_iter_readv_writev(file, &iter, pos, iter_fn);
1051 else if (fnv)
1052 ret = do_sync_readv_writev(file, &iter, pos, fnv);
1053 else 982 else
1054 ret = do_loop_readv_writev(file, &iter, pos, fn); 983 ret = do_loop_readv_writev(file, &iter, pos, fn);
1055 984
diff --git a/fs/reiserfs/file.c b/fs/reiserfs/file.c
index 751dd3f4346b..96a1bcf33db4 100644
--- a/fs/reiserfs/file.c
+++ b/fs/reiserfs/file.c
@@ -243,8 +243,6 @@ drop_write_lock:
243} 243}
244 244
245const struct file_operations reiserfs_file_operations = { 245const struct file_operations reiserfs_file_operations = {
246 .read = new_sync_read,
247 .write = new_sync_write,
248 .unlocked_ioctl = reiserfs_ioctl, 246 .unlocked_ioctl = reiserfs_ioctl,
249#ifdef CONFIG_COMPAT 247#ifdef CONFIG_COMPAT
250 .compat_ioctl = reiserfs_compat_ioctl, 248 .compat_ioctl = reiserfs_compat_ioctl,
diff --git a/fs/romfs/mmap-nommu.c b/fs/romfs/mmap-nommu.c
index 7da9e2153953..1118a0dc6b45 100644
--- a/fs/romfs/mmap-nommu.c
+++ b/fs/romfs/mmap-nommu.c
@@ -81,7 +81,6 @@ static unsigned romfs_mmap_capabilities(struct file *file)
81 81
82const struct file_operations romfs_ro_fops = { 82const struct file_operations romfs_ro_fops = {
83 .llseek = generic_file_llseek, 83 .llseek = generic_file_llseek,
84 .read = new_sync_read,
85 .read_iter = generic_file_read_iter, 84 .read_iter = generic_file_read_iter,
86 .splice_read = generic_file_splice_read, 85 .splice_read = generic_file_splice_read,
87 .mmap = romfs_mmap, 86 .mmap = romfs_mmap,
diff --git a/fs/sysv/file.c b/fs/sysv/file.c
index b00811c75b24..a48e30410ad1 100644
--- a/fs/sysv/file.c
+++ b/fs/sysv/file.c
@@ -21,9 +21,7 @@
21 */ 21 */
22const struct file_operations sysv_file_operations = { 22const struct file_operations sysv_file_operations = {
23 .llseek = generic_file_llseek, 23 .llseek = generic_file_llseek,
24 .read = new_sync_read,
25 .read_iter = generic_file_read_iter, 24 .read_iter = generic_file_read_iter,
26 .write = new_sync_write,
27 .write_iter = generic_file_write_iter, 25 .write_iter = generic_file_write_iter,
28 .mmap = generic_file_mmap, 26 .mmap = generic_file_mmap,
29 .fsync = generic_file_fsync, 27 .fsync = generic_file_fsync,
diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c
index c3d15fe83403..475b15635f11 100644
--- a/fs/ubifs/file.c
+++ b/fs/ubifs/file.c
@@ -1580,8 +1580,6 @@ const struct inode_operations ubifs_symlink_inode_operations = {
1580 1580
1581const struct file_operations ubifs_file_operations = { 1581const struct file_operations ubifs_file_operations = {
1582 .llseek = generic_file_llseek, 1582 .llseek = generic_file_llseek,
1583 .read = new_sync_read,
1584 .write = new_sync_write,
1585 .read_iter = generic_file_read_iter, 1583 .read_iter = generic_file_read_iter,
1586 .write_iter = ubifs_write_iter, 1584 .write_iter = ubifs_write_iter,
1587 .mmap = ubifs_file_mmap, 1585 .mmap = ubifs_file_mmap,
diff --git a/fs/udf/file.c b/fs/udf/file.c
index 7f885cc8b0b7..74050bff64f4 100644
--- a/fs/udf/file.c
+++ b/fs/udf/file.c
@@ -240,12 +240,10 @@ static int udf_release_file(struct inode *inode, struct file *filp)
240} 240}
241 241
242const struct file_operations udf_file_operations = { 242const struct file_operations udf_file_operations = {
243 .read = new_sync_read,
244 .read_iter = generic_file_read_iter, 243 .read_iter = generic_file_read_iter,
245 .unlocked_ioctl = udf_ioctl, 244 .unlocked_ioctl = udf_ioctl,
246 .open = generic_file_open, 245 .open = generic_file_open,
247 .mmap = generic_file_mmap, 246 .mmap = generic_file_mmap,
248 .write = new_sync_write,
249 .write_iter = udf_file_write_iter, 247 .write_iter = udf_file_write_iter,
250 .release = udf_release_file, 248 .release = udf_release_file,
251 .fsync = generic_file_fsync, 249 .fsync = generic_file_fsync,
diff --git a/fs/ufs/file.c b/fs/ufs/file.c
index c84ec010a676..042ddbf110cc 100644
--- a/fs/ufs/file.c
+++ b/fs/ufs/file.c
@@ -35,9 +35,7 @@
35 35
36const struct file_operations ufs_file_operations = { 36const struct file_operations ufs_file_operations = {
37 .llseek = generic_file_llseek, 37 .llseek = generic_file_llseek,
38 .read = new_sync_read,
39 .read_iter = generic_file_read_iter, 38 .read_iter = generic_file_read_iter,
40 .write = new_sync_write,
41 .write_iter = generic_file_write_iter, 39 .write_iter = generic_file_write_iter,
42 .mmap = generic_file_mmap, 40 .mmap = generic_file_mmap,
43 .open = generic_file_open, 41 .open = generic_file_open,
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index f44212fae653..44856c3b9617 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -1386,8 +1386,6 @@ xfs_file_llseek(
1386 1386
1387const struct file_operations xfs_file_operations = { 1387const struct file_operations xfs_file_operations = {
1388 .llseek = xfs_file_llseek, 1388 .llseek = xfs_file_llseek,
1389 .read = new_sync_read,
1390 .write = new_sync_write,
1391 .read_iter = xfs_file_read_iter, 1389 .read_iter = xfs_file_read_iter,
1392 .write_iter = xfs_file_write_iter, 1390 .write_iter = xfs_file_write_iter,
1393 .splice_read = xfs_file_splice_read, 1391 .splice_read = xfs_file_splice_read,
diff --git a/include/linux/fs.h b/include/linux/fs.h
index d502e5436c84..4d9acc91de12 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1562,8 +1562,6 @@ struct file_operations {
1562 loff_t (*llseek) (struct file *, loff_t, int); 1562 loff_t (*llseek) (struct file *, loff_t, int);
1563 ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); 1563 ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
1564 ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); 1564 ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
1565 ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
1566 ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
1567 ssize_t (*read_iter) (struct kiocb *, struct iov_iter *); 1565 ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);
1568 ssize_t (*write_iter) (struct kiocb *, struct iov_iter *); 1566 ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);
1569 int (*iterate) (struct file *, struct dir_context *); 1567 int (*iterate) (struct file *, struct dir_context *);
@@ -1639,6 +1637,7 @@ ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector,
1639 struct iovec **ret_pointer); 1637 struct iovec **ret_pointer);
1640 1638
1641extern ssize_t __vfs_read(struct file *, char __user *, size_t, loff_t *); 1639extern ssize_t __vfs_read(struct file *, char __user *, size_t, loff_t *);
1640extern ssize_t __vfs_write(struct file *, const char __user *, size_t, loff_t *);
1642extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *); 1641extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *);
1643extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *); 1642extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *);
1644extern ssize_t vfs_readv(struct file *, const struct iovec __user *, 1643extern ssize_t vfs_readv(struct file *, const struct iovec __user *,
@@ -2573,10 +2572,6 @@ extern ssize_t __generic_file_write_iter(struct kiocb *, struct iov_iter *);
2573extern ssize_t generic_file_write_iter(struct kiocb *, struct iov_iter *); 2572extern ssize_t generic_file_write_iter(struct kiocb *, struct iov_iter *);
2574extern ssize_t generic_file_direct_write(struct kiocb *, struct iov_iter *, loff_t); 2573extern ssize_t generic_file_direct_write(struct kiocb *, struct iov_iter *, loff_t);
2575extern ssize_t generic_perform_write(struct file *, struct iov_iter *, loff_t); 2574extern ssize_t generic_perform_write(struct file *, struct iov_iter *, loff_t);
2576extern ssize_t do_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos);
2577extern ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos);
2578extern ssize_t new_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos);
2579extern ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos);
2580 2575
2581ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos); 2576ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos);
2582ssize_t vfs_iter_write(struct file *file, struct iov_iter *iter, loff_t *ppos); 2577ssize_t vfs_iter_write(struct file *file, struct iov_iter *iter, loff_t *ppos);
diff --git a/include/net/9p/client.h b/include/net/9p/client.h
index 6fab66c5c5af..c6b97e58cf84 100644
--- a/include/net/9p/client.h
+++ b/include/net/9p/client.h
@@ -211,6 +211,8 @@ struct p9_dirent {
211 char d_name[256]; 211 char d_name[256];
212}; 212};
213 213
214struct iov_iter;
215
214int p9_client_statfs(struct p9_fid *fid, struct p9_rstatfs *sb); 216int p9_client_statfs(struct p9_fid *fid, struct p9_rstatfs *sb);
215int p9_client_rename(struct p9_fid *fid, struct p9_fid *newdirfid, 217int p9_client_rename(struct p9_fid *fid, struct p9_fid *newdirfid,
216 const char *name); 218 const char *name);
@@ -236,10 +238,8 @@ int p9_client_clunk(struct p9_fid *fid);
236int p9_client_fsync(struct p9_fid *fid, int datasync); 238int p9_client_fsync(struct p9_fid *fid, int datasync);
237int p9_client_remove(struct p9_fid *fid); 239int p9_client_remove(struct p9_fid *fid);
238int p9_client_unlinkat(struct p9_fid *dfid, const char *name, int flags); 240int p9_client_unlinkat(struct p9_fid *dfid, const char *name, int flags);
239int p9_client_read(struct p9_fid *fid, char *data, char __user *udata, 241int p9_client_read(struct p9_fid *fid, u64 offset, struct iov_iter *to, int *err);
240 u64 offset, u32 count); 242int p9_client_write(struct p9_fid *fid, u64 offset, struct iov_iter *from, int *err);
241int p9_client_write(struct p9_fid *fid, char *data, const char __user *udata,
242 u64 offset, u32 count);
243int p9_client_readdir(struct p9_fid *fid, char *data, u32 count, u64 offset); 243int p9_client_readdir(struct p9_fid *fid, char *data, u32 count, u64 offset);
244int p9dirent_read(struct p9_client *clnt, char *buf, int len, 244int p9dirent_read(struct p9_client *clnt, char *buf, int len,
245 struct p9_dirent *dirent); 245 struct p9_dirent *dirent);
diff --git a/include/net/9p/transport.h b/include/net/9p/transport.h
index 2a25dec30211..5122b5e40f78 100644
--- a/include/net/9p/transport.h
+++ b/include/net/9p/transport.h
@@ -61,7 +61,7 @@ struct p9_trans_module {
61 int (*cancel) (struct p9_client *, struct p9_req_t *req); 61 int (*cancel) (struct p9_client *, struct p9_req_t *req);
62 int (*cancelled)(struct p9_client *, struct p9_req_t *req); 62 int (*cancelled)(struct p9_client *, struct p9_req_t *req);
63 int (*zc_request)(struct p9_client *, struct p9_req_t *, 63 int (*zc_request)(struct p9_client *, struct p9_req_t *,
64 char *, char *, int , int, int, int); 64 struct iov_iter *, struct iov_iter *, int , int, int);
65}; 65};
66 66
67void v9fs_register_trans(struct p9_trans_module *m); 67void v9fs_register_trans(struct p9_trans_module *m);
diff --git a/kernel/acct.c b/kernel/acct.c
index e6c10d1a4058..74963d192c5d 100644
--- a/kernel/acct.c
+++ b/kernel/acct.c
@@ -213,7 +213,7 @@ static int acct_on(struct filename *pathname)
213 return -EACCES; 213 return -EACCES;
214 } 214 }
215 215
216 if (!file->f_op->write) { 216 if (!(file->f_mode & FMODE_CAN_WRITE)) {
217 kfree(acct); 217 kfree(acct);
218 filp_close(file, NULL); 218 filp_close(file, NULL);
219 return -EIO; 219 return -EIO;
diff --git a/mm/nommu.c b/mm/nommu.c
index 3fba2dc97c44..e544508e2a4b 100644
--- a/mm/nommu.c
+++ b/mm/nommu.c
@@ -1016,7 +1016,7 @@ static int validate_mmap_request(struct file *file,
1016 * device */ 1016 * device */
1017 if (!file->f_op->get_unmapped_area) 1017 if (!file->f_op->get_unmapped_area)
1018 capabilities &= ~NOMMU_MAP_DIRECT; 1018 capabilities &= ~NOMMU_MAP_DIRECT;
1019 if (!file->f_op->read) 1019 if (!(file->f_mode & FMODE_CAN_READ))
1020 capabilities &= ~NOMMU_MAP_COPY; 1020 capabilities &= ~NOMMU_MAP_COPY;
1021 1021
1022 /* The file shall have been opened with read permission. */ 1022 /* The file shall have been opened with read permission. */
@@ -1240,7 +1240,7 @@ static int do_mmap_private(struct vm_area_struct *vma,
1240 1240
1241 old_fs = get_fs(); 1241 old_fs = get_fs();
1242 set_fs(KERNEL_DS); 1242 set_fs(KERNEL_DS);
1243 ret = vma->vm_file->f_op->read(vma->vm_file, base, len, &fpos); 1243 ret = __vfs_read(vma->vm_file, base, len, &fpos);
1244 set_fs(old_fs); 1244 set_fs(old_fs);
1245 1245
1246 if (ret < 0) 1246 if (ret < 0)
diff --git a/mm/shmem.c b/mm/shmem.c
index 80b360c7bcd1..1ea2400b5245 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -3118,8 +3118,6 @@ static const struct file_operations shmem_file_operations = {
3118 .mmap = shmem_mmap, 3118 .mmap = shmem_mmap,
3119#ifdef CONFIG_TMPFS 3119#ifdef CONFIG_TMPFS
3120 .llseek = shmem_file_llseek, 3120 .llseek = shmem_file_llseek,
3121 .read = new_sync_read,
3122 .write = new_sync_write,
3123 .read_iter = shmem_file_read_iter, 3121 .read_iter = shmem_file_read_iter,
3124 .write_iter = generic_file_write_iter, 3122 .write_iter = generic_file_write_iter,
3125 .fsync = noop_fsync, 3123 .fsync = noop_fsync,
diff --git a/net/9p/client.c b/net/9p/client.c
index e86a9bea1d16..6f4c4c88db84 100644
--- a/net/9p/client.c
+++ b/net/9p/client.c
@@ -34,6 +34,7 @@
34#include <linux/slab.h> 34#include <linux/slab.h>
35#include <linux/sched.h> 35#include <linux/sched.h>
36#include <linux/uaccess.h> 36#include <linux/uaccess.h>
37#include <linux/uio.h>
37#include <net/9p/9p.h> 38#include <net/9p/9p.h>
38#include <linux/parser.h> 39#include <linux/parser.h>
39#include <net/9p/client.h> 40#include <net/9p/client.h>
@@ -555,7 +556,7 @@ out_err:
555 */ 556 */
556 557
557static int p9_check_zc_errors(struct p9_client *c, struct p9_req_t *req, 558static int p9_check_zc_errors(struct p9_client *c, struct p9_req_t *req,
558 char *uidata, int in_hdrlen, int kern_buf) 559 struct iov_iter *uidata, int in_hdrlen)
559{ 560{
560 int err; 561 int err;
561 int ecode; 562 int ecode;
@@ -591,16 +592,11 @@ static int p9_check_zc_errors(struct p9_client *c, struct p9_req_t *req,
591 ename = &req->rc->sdata[req->rc->offset]; 592 ename = &req->rc->sdata[req->rc->offset];
592 if (len > inline_len) { 593 if (len > inline_len) {
593 /* We have error in external buffer */ 594 /* We have error in external buffer */
594 if (kern_buf) { 595 err = copy_from_iter(ename + inline_len,
595 memcpy(ename + inline_len, uidata, 596 len - inline_len, uidata);
596 len - inline_len); 597 if (err != len - inline_len) {
597 } else { 598 err = -EFAULT;
598 err = copy_from_user(ename + inline_len, 599 goto out_err;
599 uidata, len - inline_len);
600 if (err) {
601 err = -EFAULT;
602 goto out_err;
603 }
604 } 600 }
605 } 601 }
606 ename = NULL; 602 ename = NULL;
@@ -806,8 +802,8 @@ reterr:
806 * p9_client_zc_rpc - issue a request and wait for a response 802 * p9_client_zc_rpc - issue a request and wait for a response
807 * @c: client session 803 * @c: client session
808 * @type: type of request 804 * @type: type of request
809 * @uidata: user bffer that should be ued for zero copy read 805 * @uidata: destination for zero copy read
810 * @uodata: user buffer that shoud be user for zero copy write 806 * @uodata: source for zero copy write
811 * @inlen: read buffer size 807 * @inlen: read buffer size
812 * @olen: write buffer size 808 * @olen: write buffer size
813 * @hdrlen: reader header size, This is the size of response protocol data 809 * @hdrlen: reader header size, This is the size of response protocol data
@@ -816,9 +812,10 @@ reterr:
816 * Returns request structure (which client must free using p9_free_req) 812 * Returns request structure (which client must free using p9_free_req)
817 */ 813 */
818static struct p9_req_t *p9_client_zc_rpc(struct p9_client *c, int8_t type, 814static struct p9_req_t *p9_client_zc_rpc(struct p9_client *c, int8_t type,
819 char *uidata, char *uodata, 815 struct iov_iter *uidata,
816 struct iov_iter *uodata,
820 int inlen, int olen, int in_hdrlen, 817 int inlen, int olen, int in_hdrlen,
821 int kern_buf, const char *fmt, ...) 818 const char *fmt, ...)
822{ 819{
823 va_list ap; 820 va_list ap;
824 int sigpending, err; 821 int sigpending, err;
@@ -841,12 +838,8 @@ static struct p9_req_t *p9_client_zc_rpc(struct p9_client *c, int8_t type,
841 } else 838 } else
842 sigpending = 0; 839 sigpending = 0;
843 840
844 /* If we are called with KERNEL_DS force kern_buf */
845 if (segment_eq(get_fs(), KERNEL_DS))
846 kern_buf = 1;
847
848 err = c->trans_mod->zc_request(c, req, uidata, uodata, 841 err = c->trans_mod->zc_request(c, req, uidata, uodata,
849 inlen, olen, in_hdrlen, kern_buf); 842 inlen, olen, in_hdrlen);
850 if (err < 0) { 843 if (err < 0) {
851 if (err == -EIO) 844 if (err == -EIO)
852 c->status = Disconnected; 845 c->status = Disconnected;
@@ -876,7 +869,7 @@ static struct p9_req_t *p9_client_zc_rpc(struct p9_client *c, int8_t type,
876 if (err < 0) 869 if (err < 0)
877 goto reterr; 870 goto reterr;
878 871
879 err = p9_check_zc_errors(c, req, uidata, in_hdrlen, kern_buf); 872 err = p9_check_zc_errors(c, req, uidata, in_hdrlen);
880 trace_9p_client_res(c, type, req->rc->tag, err); 873 trace_9p_client_res(c, type, req->rc->tag, err);
881 if (!err) 874 if (!err)
882 return req; 875 return req;
@@ -1123,6 +1116,7 @@ struct p9_fid *p9_client_attach(struct p9_client *clnt, struct p9_fid *afid,
1123 fid = NULL; 1116 fid = NULL;
1124 goto error; 1117 goto error;
1125 } 1118 }
1119 fid->uid = n_uname;
1126 1120
1127 req = p9_client_rpc(clnt, P9_TATTACH, "ddss?u", fid->fid, 1121 req = p9_client_rpc(clnt, P9_TATTACH, "ddss?u", fid->fid,
1128 afid ? afid->fid : P9_NOFID, uname, aname, n_uname); 1122 afid ? afid->fid : P9_NOFID, uname, aname, n_uname);
@@ -1541,142 +1535,128 @@ error:
1541EXPORT_SYMBOL(p9_client_unlinkat); 1535EXPORT_SYMBOL(p9_client_unlinkat);
1542 1536
1543int 1537int
1544p9_client_read(struct p9_fid *fid, char *data, char __user *udata, u64 offset, 1538p9_client_read(struct p9_fid *fid, u64 offset, struct iov_iter *to, int *err)
1545 u32 count)
1546{ 1539{
1547 char *dataptr; 1540 struct p9_client *clnt = fid->clnt;
1548 int kernel_buf = 0;
1549 struct p9_req_t *req; 1541 struct p9_req_t *req;
1550 struct p9_client *clnt; 1542 int total = 0;
1551 int err, rsize, non_zc = 0;
1552
1553 1543
1554 p9_debug(P9_DEBUG_9P, ">>> TREAD fid %d offset %llu %d\n", 1544 p9_debug(P9_DEBUG_9P, ">>> TREAD fid %d offset %llu %d\n",
1555 fid->fid, (unsigned long long) offset, count); 1545 fid->fid, (unsigned long long) offset, (int)iov_iter_count(to));
1556 err = 0; 1546
1557 clnt = fid->clnt; 1547 while (iov_iter_count(to)) {
1558 1548 int count = iov_iter_count(to);
1559 rsize = fid->iounit; 1549 int rsize, non_zc = 0;
1560 if (!rsize || rsize > clnt->msize-P9_IOHDRSZ) 1550 char *dataptr;
1561 rsize = clnt->msize - P9_IOHDRSZ; 1551
1562 1552 rsize = fid->iounit;
1563 if (count < rsize) 1553 if (!rsize || rsize > clnt->msize-P9_IOHDRSZ)
1564 rsize = count; 1554 rsize = clnt->msize - P9_IOHDRSZ;
1565 1555
1566 /* Don't bother zerocopy for small IO (< 1024) */ 1556 if (count < rsize)
1567 if (clnt->trans_mod->zc_request && rsize > 1024) { 1557 rsize = count;
1568 char *indata; 1558
1569 if (data) { 1559 /* Don't bother zerocopy for small IO (< 1024) */
1570 kernel_buf = 1; 1560 if (clnt->trans_mod->zc_request && rsize > 1024) {
1571 indata = data; 1561 /*
1572 } else 1562 * response header len is 11
1573 indata = (__force char *)udata; 1563 * PDU Header(7) + IO Size (4)
1574 /* 1564 */
1575 * response header len is 11 1565 req = p9_client_zc_rpc(clnt, P9_TREAD, to, NULL, rsize,
1576 * PDU Header(7) + IO Size (4) 1566 0, 11, "dqd", fid->fid,
1577 */ 1567 offset, rsize);
1578 req = p9_client_zc_rpc(clnt, P9_TREAD, indata, NULL, rsize, 0, 1568 } else {
1579 11, kernel_buf, "dqd", fid->fid, 1569 non_zc = 1;
1580 offset, rsize); 1570 req = p9_client_rpc(clnt, P9_TREAD, "dqd", fid->fid, offset,
1581 } else { 1571 rsize);
1582 non_zc = 1; 1572 }
1583 req = p9_client_rpc(clnt, P9_TREAD, "dqd", fid->fid, offset, 1573 if (IS_ERR(req)) {
1584 rsize); 1574 *err = PTR_ERR(req);
1585 } 1575 break;
1586 if (IS_ERR(req)) { 1576 }
1587 err = PTR_ERR(req);
1588 goto error;
1589 }
1590 1577
1591 err = p9pdu_readf(req->rc, clnt->proto_version, "D", &count, &dataptr); 1578 *err = p9pdu_readf(req->rc, clnt->proto_version,
1592 if (err) { 1579 "D", &count, &dataptr);
1593 trace_9p_protocol_dump(clnt, req->rc); 1580 if (*err) {
1594 goto free_and_error; 1581 trace_9p_protocol_dump(clnt, req->rc);
1595 } 1582 p9_free_req(clnt, req);
1583 break;
1584 }
1596 1585
1597 p9_debug(P9_DEBUG_9P, "<<< RREAD count %d\n", count); 1586 p9_debug(P9_DEBUG_9P, "<<< RREAD count %d\n", count);
1587 if (!count) {
1588 p9_free_req(clnt, req);
1589 break;
1590 }
1598 1591
1599 if (non_zc) { 1592 if (non_zc) {
1600 if (data) { 1593 int n = copy_to_iter(dataptr, count, to);
1601 memmove(data, dataptr, count); 1594 total += n;
1602 } else { 1595 offset += n;
1603 err = copy_to_user(udata, dataptr, count); 1596 if (n != count) {
1604 if (err) { 1597 *err = -EFAULT;
1605 err = -EFAULT; 1598 p9_free_req(clnt, req);
1606 goto free_and_error; 1599 break;
1607 } 1600 }
1601 } else {
1602 iov_iter_advance(to, count);
1603 total += count;
1604 offset += count;
1608 } 1605 }
1606 p9_free_req(clnt, req);
1609 } 1607 }
1610 p9_free_req(clnt, req); 1608 return total;
1611 return count;
1612
1613free_and_error:
1614 p9_free_req(clnt, req);
1615error:
1616 return err;
1617} 1609}
1618EXPORT_SYMBOL(p9_client_read); 1610EXPORT_SYMBOL(p9_client_read);
1619 1611
1620int 1612int
1621p9_client_write(struct p9_fid *fid, char *data, const char __user *udata, 1613p9_client_write(struct p9_fid *fid, u64 offset, struct iov_iter *from, int *err)
1622 u64 offset, u32 count)
1623{ 1614{
1624 int err, rsize; 1615 struct p9_client *clnt = fid->clnt;
1625 int kernel_buf = 0;
1626 struct p9_client *clnt;
1627 struct p9_req_t *req; 1616 struct p9_req_t *req;
1617 int total = 0;
1618
1619 p9_debug(P9_DEBUG_9P, ">>> TWRITE fid %d offset %llu count %zd\n",
1620 fid->fid, (unsigned long long) offset,
1621 iov_iter_count(from));
1622
1623 while (iov_iter_count(from)) {
1624 int count = iov_iter_count(from);
1625 int rsize = fid->iounit;
1626 if (!rsize || rsize > clnt->msize-P9_IOHDRSZ)
1627 rsize = clnt->msize - P9_IOHDRSZ;
1628
1629 if (count < rsize)
1630 rsize = count;
1631
1632 /* Don't bother zerocopy for small IO (< 1024) */
1633 if (clnt->trans_mod->zc_request && rsize > 1024) {
1634 req = p9_client_zc_rpc(clnt, P9_TWRITE, NULL, from, 0,
1635 rsize, P9_ZC_HDR_SZ, "dqd",
1636 fid->fid, offset, rsize);
1637 } else {
1638 req = p9_client_rpc(clnt, P9_TWRITE, "dqV", fid->fid,
1639 offset, rsize, from);
1640 }
1641 if (IS_ERR(req)) {
1642 *err = PTR_ERR(req);
1643 break;
1644 }
1628 1645
1629 p9_debug(P9_DEBUG_9P, ">>> TWRITE fid %d offset %llu count %d\n", 1646 *err = p9pdu_readf(req->rc, clnt->proto_version, "d", &count);
1630 fid->fid, (unsigned long long) offset, count); 1647 if (*err) {
1631 err = 0; 1648 trace_9p_protocol_dump(clnt, req->rc);
1632 clnt = fid->clnt; 1649 p9_free_req(clnt, req);
1633 1650 }
1634 rsize = fid->iounit;
1635 if (!rsize || rsize > clnt->msize-P9_IOHDRSZ)
1636 rsize = clnt->msize - P9_IOHDRSZ;
1637 1651
1638 if (count < rsize) 1652 p9_debug(P9_DEBUG_9P, "<<< RWRITE count %d\n", count);
1639 rsize = count;
1640 1653
1641 /* Don't bother zerocopy for small IO (< 1024) */ 1654 p9_free_req(clnt, req);
1642 if (clnt->trans_mod->zc_request && rsize > 1024) { 1655 iov_iter_advance(from, count);
1643 char *odata; 1656 total += count;
1644 if (data) { 1657 offset += count;
1645 kernel_buf = 1;
1646 odata = data;
1647 } else
1648 odata = (char *)udata;
1649 req = p9_client_zc_rpc(clnt, P9_TWRITE, NULL, odata, 0, rsize,
1650 P9_ZC_HDR_SZ, kernel_buf, "dqd",
1651 fid->fid, offset, rsize);
1652 } else {
1653 if (data)
1654 req = p9_client_rpc(clnt, P9_TWRITE, "dqD", fid->fid,
1655 offset, rsize, data);
1656 else
1657 req = p9_client_rpc(clnt, P9_TWRITE, "dqU", fid->fid,
1658 offset, rsize, udata);
1659 }
1660 if (IS_ERR(req)) {
1661 err = PTR_ERR(req);
1662 goto error;
1663 }
1664
1665 err = p9pdu_readf(req->rc, clnt->proto_version, "d", &count);
1666 if (err) {
1667 trace_9p_protocol_dump(clnt, req->rc);
1668 goto free_and_error;
1669 } 1658 }
1670 1659 return total;
1671 p9_debug(P9_DEBUG_9P, "<<< RWRITE count %d\n", count);
1672
1673 p9_free_req(clnt, req);
1674 return count;
1675
1676free_and_error:
1677 p9_free_req(clnt, req);
1678error:
1679 return err;
1680} 1660}
1681EXPORT_SYMBOL(p9_client_write); 1661EXPORT_SYMBOL(p9_client_write);
1682 1662
@@ -2068,6 +2048,10 @@ int p9_client_readdir(struct p9_fid *fid, char *data, u32 count, u64 offset)
2068 struct p9_client *clnt; 2048 struct p9_client *clnt;
2069 struct p9_req_t *req; 2049 struct p9_req_t *req;
2070 char *dataptr; 2050 char *dataptr;
2051 struct kvec kv = {.iov_base = data, .iov_len = count};
2052 struct iov_iter to;
2053
2054 iov_iter_kvec(&to, READ | ITER_KVEC, &kv, 1, count);
2071 2055
2072 p9_debug(P9_DEBUG_9P, ">>> TREADDIR fid %d offset %llu count %d\n", 2056 p9_debug(P9_DEBUG_9P, ">>> TREADDIR fid %d offset %llu count %d\n",
2073 fid->fid, (unsigned long long) offset, count); 2057 fid->fid, (unsigned long long) offset, count);
@@ -2088,8 +2072,8 @@ int p9_client_readdir(struct p9_fid *fid, char *data, u32 count, u64 offset)
2088 * response header len is 11 2072 * response header len is 11
2089 * PDU Header(7) + IO Size (4) 2073 * PDU Header(7) + IO Size (4)
2090 */ 2074 */
2091 req = p9_client_zc_rpc(clnt, P9_TREADDIR, data, NULL, rsize, 0, 2075 req = p9_client_zc_rpc(clnt, P9_TREADDIR, &to, NULL, rsize, 0,
2092 11, 1, "dqd", fid->fid, offset, rsize); 2076 11, "dqd", fid->fid, offset, rsize);
2093 } else { 2077 } else {
2094 non_zc = 1; 2078 non_zc = 1;
2095 req = p9_client_rpc(clnt, P9_TREADDIR, "dqd", fid->fid, 2079 req = p9_client_rpc(clnt, P9_TREADDIR, "dqd", fid->fid,
diff --git a/net/9p/protocol.c b/net/9p/protocol.c
index ab9127ec5b7a..e9d0f0c1a048 100644
--- a/net/9p/protocol.c
+++ b/net/9p/protocol.c
@@ -33,6 +33,7 @@
33#include <linux/sched.h> 33#include <linux/sched.h>
34#include <linux/stddef.h> 34#include <linux/stddef.h>
35#include <linux/types.h> 35#include <linux/types.h>
36#include <linux/uio.h>
36#include <net/9p/9p.h> 37#include <net/9p/9p.h>
37#include <net/9p/client.h> 38#include <net/9p/client.h>
38#include "protocol.h" 39#include "protocol.h"
@@ -69,10 +70,11 @@ static size_t pdu_write(struct p9_fcall *pdu, const void *data, size_t size)
69} 70}
70 71
71static size_t 72static size_t
72pdu_write_u(struct p9_fcall *pdu, const char __user *udata, size_t size) 73pdu_write_u(struct p9_fcall *pdu, struct iov_iter *from, size_t size)
73{ 74{
74 size_t len = min(pdu->capacity - pdu->size, size); 75 size_t len = min(pdu->capacity - pdu->size, size);
75 if (copy_from_user(&pdu->sdata[pdu->size], udata, len)) 76 struct iov_iter i = *from;
77 if (copy_from_iter(&pdu->sdata[pdu->size], len, &i) != len)
76 len = 0; 78 len = 0;
77 79
78 pdu->size += len; 80 pdu->size += len;
@@ -437,23 +439,13 @@ p9pdu_vwritef(struct p9_fcall *pdu, int proto_version, const char *fmt,
437 stbuf->extension, stbuf->n_uid, 439 stbuf->extension, stbuf->n_uid,
438 stbuf->n_gid, stbuf->n_muid); 440 stbuf->n_gid, stbuf->n_muid);
439 } break; 441 } break;
440 case 'D':{ 442 case 'V':{
441 uint32_t count = va_arg(ap, uint32_t);
442 const void *data = va_arg(ap, const void *);
443
444 errcode = p9pdu_writef(pdu, proto_version, "d",
445 count);
446 if (!errcode && pdu_write(pdu, data, count))
447 errcode = -EFAULT;
448 }
449 break;
450 case 'U':{
451 int32_t count = va_arg(ap, int32_t); 443 int32_t count = va_arg(ap, int32_t);
452 const char __user *udata = 444 struct iov_iter *from =
453 va_arg(ap, const void __user *); 445 va_arg(ap, struct iov_iter *);
454 errcode = p9pdu_writef(pdu, proto_version, "d", 446 errcode = p9pdu_writef(pdu, proto_version, "d",
455 count); 447 count);
456 if (!errcode && pdu_write_u(pdu, udata, count)) 448 if (!errcode && pdu_write_u(pdu, from, count))
457 errcode = -EFAULT; 449 errcode = -EFAULT;
458 } 450 }
459 break; 451 break;
diff --git a/net/9p/trans_common.c b/net/9p/trans_common.c
index 2ee3879161b1..38aa6345bdfa 100644
--- a/net/9p/trans_common.c
+++ b/net/9p/trans_common.c
@@ -12,12 +12,8 @@
12 * 12 *
13 */ 13 */
14 14
15#include <linux/slab.h> 15#include <linux/mm.h>
16#include <linux/module.h> 16#include <linux/module.h>
17#include <net/9p/9p.h>
18#include <net/9p/client.h>
19#include <linux/scatterlist.h>
20#include "trans_common.h"
21 17
22/** 18/**
23 * p9_release_req_pages - Release pages after the transaction. 19 * p9_release_req_pages - Release pages after the transaction.
@@ -31,39 +27,3 @@ void p9_release_pages(struct page **pages, int nr_pages)
31 put_page(pages[i]); 27 put_page(pages[i]);
32} 28}
33EXPORT_SYMBOL(p9_release_pages); 29EXPORT_SYMBOL(p9_release_pages);
34
35/**
36 * p9_nr_pages - Return number of pages needed to accommodate the payload.
37 */
38int p9_nr_pages(char *data, int len)
39{
40 unsigned long start_page, end_page;
41 start_page = (unsigned long)data >> PAGE_SHIFT;
42 end_page = ((unsigned long)data + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
43 return end_page - start_page;
44}
45EXPORT_SYMBOL(p9_nr_pages);
46
47/**
48 * payload_gup - Translates user buffer into kernel pages and
49 * pins them either for read/write through get_user_pages_fast().
50 * @req: Request to be sent to server.
51 * @pdata_off: data offset into the first page after translation (gup).
52 * @pdata_len: Total length of the IO. gup may not return requested # of pages.
53 * @nr_pages: number of pages to accommodate the payload
54 * @rw: Indicates if the pages are for read or write.
55 */
56
57int p9_payload_gup(char *data, int *nr_pages, struct page **pages, int write)
58{
59 int nr_mapped_pages;
60
61 nr_mapped_pages = get_user_pages_fast((unsigned long)data,
62 *nr_pages, write, pages);
63 if (nr_mapped_pages <= 0)
64 return nr_mapped_pages;
65
66 *nr_pages = nr_mapped_pages;
67 return 0;
68}
69EXPORT_SYMBOL(p9_payload_gup);
diff --git a/net/9p/trans_common.h b/net/9p/trans_common.h
index 173bb550a9eb..c43babb3f635 100644
--- a/net/9p/trans_common.h
+++ b/net/9p/trans_common.h
@@ -13,5 +13,3 @@
13 */ 13 */
14 14
15void p9_release_pages(struct page **, int); 15void p9_release_pages(struct page **, int);
16int p9_payload_gup(char *, int *, struct page **, int);
17int p9_nr_pages(char *, int);
diff --git a/net/9p/trans_virtio.c b/net/9p/trans_virtio.c
index 36a1a739ad68..e62bcbbabb5e 100644
--- a/net/9p/trans_virtio.c
+++ b/net/9p/trans_virtio.c
@@ -217,15 +217,15 @@ static int p9_virtio_cancel(struct p9_client *client, struct p9_req_t *req)
217 * @start: which segment of the sg_list to start at 217 * @start: which segment of the sg_list to start at
218 * @pdata: a list of pages to add into sg. 218 * @pdata: a list of pages to add into sg.
219 * @nr_pages: number of pages to pack into the scatter/gather list 219 * @nr_pages: number of pages to pack into the scatter/gather list
220 * @data: data to pack into scatter/gather list 220 * @offs: amount of data in the beginning of first page _not_ to pack
221 * @count: amount of data to pack into the scatter/gather list 221 * @count: amount of data to pack into the scatter/gather list
222 */ 222 */
223static int 223static int
224pack_sg_list_p(struct scatterlist *sg, int start, int limit, 224pack_sg_list_p(struct scatterlist *sg, int start, int limit,
225 struct page **pdata, int nr_pages, char *data, int count) 225 struct page **pdata, int nr_pages, size_t offs, int count)
226{ 226{
227 int i = 0, s; 227 int i = 0, s;
228 int data_off; 228 int data_off = offs;
229 int index = start; 229 int index = start;
230 230
231 BUG_ON(nr_pages > (limit - start)); 231 BUG_ON(nr_pages > (limit - start));
@@ -233,16 +233,14 @@ pack_sg_list_p(struct scatterlist *sg, int start, int limit,
233 * if the first page doesn't start at 233 * if the first page doesn't start at
234 * page boundary find the offset 234 * page boundary find the offset
235 */ 235 */
236 data_off = offset_in_page(data);
237 while (nr_pages) { 236 while (nr_pages) {
238 s = rest_of_page(data); 237 s = PAGE_SIZE - data_off;
239 if (s > count) 238 if (s > count)
240 s = count; 239 s = count;
241 /* Make sure we don't terminate early. */ 240 /* Make sure we don't terminate early. */
242 sg_unmark_end(&sg[index]); 241 sg_unmark_end(&sg[index]);
243 sg_set_page(&sg[index++], pdata[i++], s, data_off); 242 sg_set_page(&sg[index++], pdata[i++], s, data_off);
244 data_off = 0; 243 data_off = 0;
245 data += s;
246 count -= s; 244 count -= s;
247 nr_pages--; 245 nr_pages--;
248 } 246 }
@@ -314,11 +312,20 @@ req_retry:
314} 312}
315 313
316static int p9_get_mapped_pages(struct virtio_chan *chan, 314static int p9_get_mapped_pages(struct virtio_chan *chan,
317 struct page **pages, char *data, 315 struct page ***pages,
318 int nr_pages, int write, int kern_buf) 316 struct iov_iter *data,
317 int count,
318 size_t *offs,
319 int *need_drop)
319{ 320{
321 int nr_pages;
320 int err; 322 int err;
321 if (!kern_buf) { 323
324 if (!iov_iter_count(data))
325 return 0;
326
327 if (!(data->type & ITER_KVEC)) {
328 int n;
322 /* 329 /*
323 * We allow only p9_max_pages pinned. We wait for the 330 * We allow only p9_max_pages pinned. We wait for the
324 * Other zc request to finish here 331 * Other zc request to finish here
@@ -329,26 +336,49 @@ static int p9_get_mapped_pages(struct virtio_chan *chan,
329 if (err == -ERESTARTSYS) 336 if (err == -ERESTARTSYS)
330 return err; 337 return err;
331 } 338 }
332 err = p9_payload_gup(data, &nr_pages, pages, write); 339 n = iov_iter_get_pages_alloc(data, pages, count, offs);
333 if (err < 0) 340 if (n < 0)
334 return err; 341 return n;
342 *need_drop = 1;
343 nr_pages = DIV_ROUND_UP(n + *offs, PAGE_SIZE);
335 atomic_add(nr_pages, &vp_pinned); 344 atomic_add(nr_pages, &vp_pinned);
345 return n;
336 } else { 346 } else {
337 /* kernel buffer, no need to pin pages */ 347 /* kernel buffer, no need to pin pages */
338 int s, index = 0; 348 int index;
339 int count = nr_pages; 349 size_t len;
340 while (nr_pages) { 350 void *p;
341 s = rest_of_page(data); 351
342 if (is_vmalloc_addr(data)) 352 /* we'd already checked that it's non-empty */
343 pages[index++] = vmalloc_to_page(data); 353 while (1) {
354 len = iov_iter_single_seg_count(data);
355 if (likely(len)) {
356 p = data->kvec->iov_base + data->iov_offset;
357 break;
358 }
359 iov_iter_advance(data, 0);
360 }
361 if (len > count)
362 len = count;
363
364 nr_pages = DIV_ROUND_UP((unsigned long)p + len, PAGE_SIZE) -
365 (unsigned long)p / PAGE_SIZE;
366
367 *pages = kmalloc(sizeof(struct page *) * nr_pages, GFP_NOFS);
368 if (!*pages)
369 return -ENOMEM;
370
371 *need_drop = 0;
372 p -= (*offs = (unsigned long)p % PAGE_SIZE);
373 for (index = 0; index < nr_pages; index++) {
374 if (is_vmalloc_addr(p))
375 (*pages)[index] = vmalloc_to_page(p);
344 else 376 else
345 pages[index++] = kmap_to_page(data); 377 (*pages)[index] = kmap_to_page(p);
346 data += s; 378 p += PAGE_SIZE;
347 nr_pages--;
348 } 379 }
349 nr_pages = count; 380 return len;
350 } 381 }
351 return nr_pages;
352} 382}
353 383
354/** 384/**
@@ -364,8 +394,8 @@ static int p9_get_mapped_pages(struct virtio_chan *chan,
364 */ 394 */
365static int 395static int
366p9_virtio_zc_request(struct p9_client *client, struct p9_req_t *req, 396p9_virtio_zc_request(struct p9_client *client, struct p9_req_t *req,
367 char *uidata, char *uodata, int inlen, 397 struct iov_iter *uidata, struct iov_iter *uodata,
368 int outlen, int in_hdr_len, int kern_buf) 398 int inlen, int outlen, int in_hdr_len)
369{ 399{
370 int in, out, err, out_sgs, in_sgs; 400 int in, out, err, out_sgs, in_sgs;
371 unsigned long flags; 401 unsigned long flags;
@@ -373,41 +403,32 @@ p9_virtio_zc_request(struct p9_client *client, struct p9_req_t *req,
373 struct page **in_pages = NULL, **out_pages = NULL; 403 struct page **in_pages = NULL, **out_pages = NULL;
374 struct virtio_chan *chan = client->trans; 404 struct virtio_chan *chan = client->trans;
375 struct scatterlist *sgs[4]; 405 struct scatterlist *sgs[4];
406 size_t offs;
407 int need_drop = 0;
376 408
377 p9_debug(P9_DEBUG_TRANS, "virtio request\n"); 409 p9_debug(P9_DEBUG_TRANS, "virtio request\n");
378 410
379 if (uodata) { 411 if (uodata) {
380 out_nr_pages = p9_nr_pages(uodata, outlen); 412 int n = p9_get_mapped_pages(chan, &out_pages, uodata,
381 out_pages = kmalloc(sizeof(struct page *) * out_nr_pages, 413 outlen, &offs, &need_drop);
382 GFP_NOFS); 414 if (n < 0)
383 if (!out_pages) { 415 return n;
384 err = -ENOMEM; 416 out_nr_pages = DIV_ROUND_UP(n + offs, PAGE_SIZE);
385 goto err_out; 417 if (n != outlen) {
386 } 418 __le32 v = cpu_to_le32(n);
387 out_nr_pages = p9_get_mapped_pages(chan, out_pages, uodata, 419 memcpy(&req->tc->sdata[req->tc->size - 4], &v, 4);
388 out_nr_pages, 0, kern_buf); 420 outlen = n;
389 if (out_nr_pages < 0) {
390 err = out_nr_pages;
391 kfree(out_pages);
392 out_pages = NULL;
393 goto err_out;
394 } 421 }
395 } 422 } else if (uidata) {
396 if (uidata) { 423 int n = p9_get_mapped_pages(chan, &in_pages, uidata,
397 in_nr_pages = p9_nr_pages(uidata, inlen); 424 inlen, &offs, &need_drop);
398 in_pages = kmalloc(sizeof(struct page *) * in_nr_pages, 425 if (n < 0)
399 GFP_NOFS); 426 return n;
400 if (!in_pages) { 427 in_nr_pages = DIV_ROUND_UP(n + offs, PAGE_SIZE);
401 err = -ENOMEM; 428 if (n != inlen) {
402 goto err_out; 429 __le32 v = cpu_to_le32(n);
403 } 430 memcpy(&req->tc->sdata[req->tc->size - 4], &v, 4);
404 in_nr_pages = p9_get_mapped_pages(chan, in_pages, uidata, 431 inlen = n;
405 in_nr_pages, 1, kern_buf);
406 if (in_nr_pages < 0) {
407 err = in_nr_pages;
408 kfree(in_pages);
409 in_pages = NULL;
410 goto err_out;
411 } 432 }
412 } 433 }
413 req->status = REQ_STATUS_SENT; 434 req->status = REQ_STATUS_SENT;
@@ -426,7 +447,7 @@ req_retry_pinned:
426 if (out_pages) { 447 if (out_pages) {
427 sgs[out_sgs++] = chan->sg + out; 448 sgs[out_sgs++] = chan->sg + out;
428 out += pack_sg_list_p(chan->sg, out, VIRTQUEUE_NUM, 449 out += pack_sg_list_p(chan->sg, out, VIRTQUEUE_NUM,
429 out_pages, out_nr_pages, uodata, outlen); 450 out_pages, out_nr_pages, offs, outlen);
430 } 451 }
431 452
432 /* 453 /*
@@ -444,7 +465,7 @@ req_retry_pinned:
444 if (in_pages) { 465 if (in_pages) {
445 sgs[out_sgs + in_sgs++] = chan->sg + out + in; 466 sgs[out_sgs + in_sgs++] = chan->sg + out + in;
446 in += pack_sg_list_p(chan->sg, out + in, VIRTQUEUE_NUM, 467 in += pack_sg_list_p(chan->sg, out + in, VIRTQUEUE_NUM,
447 in_pages, in_nr_pages, uidata, inlen); 468 in_pages, in_nr_pages, offs, inlen);
448 } 469 }
449 470
450 BUG_ON(out_sgs + in_sgs > ARRAY_SIZE(sgs)); 471 BUG_ON(out_sgs + in_sgs > ARRAY_SIZE(sgs));
@@ -478,7 +499,7 @@ req_retry_pinned:
478 * Non kernel buffers are pinned, unpin them 499 * Non kernel buffers are pinned, unpin them
479 */ 500 */
480err_out: 501err_out:
481 if (!kern_buf) { 502 if (need_drop) {
482 if (in_pages) { 503 if (in_pages) {
483 p9_release_pages(in_pages, in_nr_pages); 504 p9_release_pages(in_pages, in_nr_pages);
484 atomic_sub(in_nr_pages, &vp_pinned); 505 atomic_sub(in_nr_pages, &vp_pinned);
diff --git a/net/socket.c b/net/socket.c
index 5b0126234606..3e33959f3ce5 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -140,8 +140,6 @@ static ssize_t sock_splice_read(struct file *file, loff_t *ppos,
140static const struct file_operations socket_file_ops = { 140static const struct file_operations socket_file_ops = {
141 .owner = THIS_MODULE, 141 .owner = THIS_MODULE,
142 .llseek = no_llseek, 142 .llseek = no_llseek,
143 .read = new_sync_read,
144 .write = new_sync_write,
145 .read_iter = sock_read_iter, 143 .read_iter = sock_read_iter,
146 .write_iter = sock_write_iter, 144 .write_iter = sock_write_iter,
147 .poll = sock_poll, 145 .poll = sock_poll,
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
index a69ebc79bc50..8e43610ec9b5 100644
--- a/sound/core/pcm_native.c
+++ b/sound/core/pcm_native.c
@@ -3033,9 +3033,7 @@ static ssize_t snd_pcm_write(struct file *file, const char __user *buf,
3033 return result; 3033 return result;
3034} 3034}
3035 3035
3036static ssize_t snd_pcm_aio_read(struct kiocb *iocb, const struct iovec *iov, 3036static ssize_t snd_pcm_readv(struct kiocb *iocb, struct iov_iter *to)
3037 unsigned long nr_segs, loff_t pos)
3038
3039{ 3037{
3040 struct snd_pcm_file *pcm_file; 3038 struct snd_pcm_file *pcm_file;
3041 struct snd_pcm_substream *substream; 3039 struct snd_pcm_substream *substream;
@@ -3052,16 +3050,18 @@ static ssize_t snd_pcm_aio_read(struct kiocb *iocb, const struct iovec *iov,
3052 runtime = substream->runtime; 3050 runtime = substream->runtime;
3053 if (runtime->status->state == SNDRV_PCM_STATE_OPEN) 3051 if (runtime->status->state == SNDRV_PCM_STATE_OPEN)
3054 return -EBADFD; 3052 return -EBADFD;
3055 if (nr_segs > 1024 || nr_segs != runtime->channels) 3053 if (!iter_is_iovec(to))
3054 return -EINVAL;
3055 if (to->nr_segs > 1024 || to->nr_segs != runtime->channels)
3056 return -EINVAL; 3056 return -EINVAL;
3057 if (!frame_aligned(runtime, iov->iov_len)) 3057 if (!frame_aligned(runtime, to->iov->iov_len))
3058 return -EINVAL; 3058 return -EINVAL;
3059 frames = bytes_to_samples(runtime, iov->iov_len); 3059 frames = bytes_to_samples(runtime, to->iov->iov_len);
3060 bufs = kmalloc(sizeof(void *) * nr_segs, GFP_KERNEL); 3060 bufs = kmalloc(sizeof(void *) * to->nr_segs, GFP_KERNEL);
3061 if (bufs == NULL) 3061 if (bufs == NULL)
3062 return -ENOMEM; 3062 return -ENOMEM;
3063 for (i = 0; i < nr_segs; ++i) 3063 for (i = 0; i < to->nr_segs; ++i)
3064 bufs[i] = iov[i].iov_base; 3064 bufs[i] = to->iov[i].iov_base;
3065 result = snd_pcm_lib_readv(substream, bufs, frames); 3065 result = snd_pcm_lib_readv(substream, bufs, frames);
3066 if (result > 0) 3066 if (result > 0)
3067 result = frames_to_bytes(runtime, result); 3067 result = frames_to_bytes(runtime, result);
@@ -3069,8 +3069,7 @@ static ssize_t snd_pcm_aio_read(struct kiocb *iocb, const struct iovec *iov,
3069 return result; 3069 return result;
3070} 3070}
3071 3071
3072static ssize_t snd_pcm_aio_write(struct kiocb *iocb, const struct iovec *iov, 3072static ssize_t snd_pcm_writev(struct kiocb *iocb, struct iov_iter *from)
3073 unsigned long nr_segs, loff_t pos)
3074{ 3073{
3075 struct snd_pcm_file *pcm_file; 3074 struct snd_pcm_file *pcm_file;
3076 struct snd_pcm_substream *substream; 3075 struct snd_pcm_substream *substream;
@@ -3087,15 +3086,17 @@ static ssize_t snd_pcm_aio_write(struct kiocb *iocb, const struct iovec *iov,
3087 runtime = substream->runtime; 3086 runtime = substream->runtime;
3088 if (runtime->status->state == SNDRV_PCM_STATE_OPEN) 3087 if (runtime->status->state == SNDRV_PCM_STATE_OPEN)
3089 return -EBADFD; 3088 return -EBADFD;
3090 if (nr_segs > 128 || nr_segs != runtime->channels || 3089 if (!iter_is_iovec(from))
3091 !frame_aligned(runtime, iov->iov_len)) 3090 return -EINVAL;
3091 if (from->nr_segs > 128 || from->nr_segs != runtime->channels ||
3092 !frame_aligned(runtime, from->iov->iov_len))
3092 return -EINVAL; 3093 return -EINVAL;
3093 frames = bytes_to_samples(runtime, iov->iov_len); 3094 frames = bytes_to_samples(runtime, from->iov->iov_len);
3094 bufs = kmalloc(sizeof(void *) * nr_segs, GFP_KERNEL); 3095 bufs = kmalloc(sizeof(void *) * from->nr_segs, GFP_KERNEL);
3095 if (bufs == NULL) 3096 if (bufs == NULL)
3096 return -ENOMEM; 3097 return -ENOMEM;
3097 for (i = 0; i < nr_segs; ++i) 3098 for (i = 0; i < from->nr_segs; ++i)
3098 bufs[i] = iov[i].iov_base; 3099 bufs[i] = from->iov[i].iov_base;
3099 result = snd_pcm_lib_writev(substream, bufs, frames); 3100 result = snd_pcm_lib_writev(substream, bufs, frames);
3100 if (result > 0) 3101 if (result > 0)
3101 result = frames_to_bytes(runtime, result); 3102 result = frames_to_bytes(runtime, result);
@@ -3633,7 +3634,7 @@ const struct file_operations snd_pcm_f_ops[2] = {
3633 { 3634 {
3634 .owner = THIS_MODULE, 3635 .owner = THIS_MODULE,
3635 .write = snd_pcm_write, 3636 .write = snd_pcm_write,
3636 .aio_write = snd_pcm_aio_write, 3637 .write_iter = snd_pcm_writev,
3637 .open = snd_pcm_playback_open, 3638 .open = snd_pcm_playback_open,
3638 .release = snd_pcm_release, 3639 .release = snd_pcm_release,
3639 .llseek = no_llseek, 3640 .llseek = no_llseek,
@@ -3647,7 +3648,7 @@ const struct file_operations snd_pcm_f_ops[2] = {
3647 { 3648 {
3648 .owner = THIS_MODULE, 3649 .owner = THIS_MODULE,
3649 .read = snd_pcm_read, 3650 .read = snd_pcm_read,
3650 .aio_read = snd_pcm_aio_read, 3651 .read_iter = snd_pcm_readv,
3651 .open = snd_pcm_capture_open, 3652 .open = snd_pcm_capture_open,
3652 .release = snd_pcm_release, 3653 .release = snd_pcm_release,
3653 .llseek = no_llseek, 3654 .llseek = no_llseek,