Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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
...

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