diff options
Diffstat (limited to 'fs')
60 files changed, 300 insertions, 820 deletions
diff --git a/fs/9p/v9fs_vfs.h b/fs/9p/v9fs_vfs.h index b83ebfbf3fdc..5a0db6dec8d1 100644 --- a/fs/9p/v9fs_vfs.h +++ b/fs/9p/v9fs_vfs.h | |||
@@ -68,14 +68,10 @@ int v9fs_file_open(struct inode *inode, struct file *file); | |||
68 | void v9fs_inode2stat(struct inode *inode, struct p9_wstat *stat); | 68 | void v9fs_inode2stat(struct inode *inode, struct p9_wstat *stat); |
69 | int v9fs_uflags2omode(int uflags, int extended); | 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 | void v9fs_blank_wstat(struct p9_wstat *wstat); | 71 | void v9fs_blank_wstat(struct p9_wstat *wstat); |
74 | int v9fs_vfs_setattr_dotl(struct dentry *, struct iattr *); | 72 | int v9fs_vfs_setattr_dotl(struct dentry *, struct iattr *); |
75 | int v9fs_file_fsync_dotl(struct file *filp, loff_t start, loff_t end, | 73 | int v9fs_file_fsync_dotl(struct file *filp, loff_t start, loff_t end, |
76 | int datasync); | 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 | int v9fs_refresh_inode(struct p9_fid *fid, struct inode *inode); | 75 | int v9fs_refresh_inode(struct p9_fid *fid, struct inode *inode); |
80 | int v9fs_refresh_inode_dotl(struct p9_fid *fid, struct inode *inode); | 76 | int v9fs_refresh_inode_dotl(struct p9_fid *fid, struct inode *inode); |
81 | static inline void v9fs_invalidate_inode_attr(struct inode *inode) | 77 | static inline void v9fs_invalidate_inode_attr(struct inode *inode) |
diff --git a/fs/9p/vfs_addr.c b/fs/9p/vfs_addr.c index ff1a5bac4200..2e38f9a5b472 100644 --- a/fs/9p/vfs_addr.c +++ b/fs/9p/vfs_addr.c | |||
@@ -51,12 +51,11 @@ | |||
51 | */ | 51 | */ |
52 | static int v9fs_fid_readpage(struct p9_fid *fid, struct page *page) | 52 | static int v9fs_fid_readpage(struct p9_fid *fid, struct page *page) |
53 | { | 53 | { |
54 | int retval; | 54 | struct inode *inode = page->mapping->host; |
55 | loff_t offset; | 55 | struct bio_vec bvec = {.bv_page = page, .bv_len = PAGE_SIZE}; |
56 | char *buffer; | 56 | struct iov_iter to; |
57 | struct inode *inode; | 57 | int retval, err; |
58 | 58 | ||
59 | inode = page->mapping->host; | ||
60 | p9_debug(P9_DEBUG_VFS, "\n"); | 59 | p9_debug(P9_DEBUG_VFS, "\n"); |
61 | 60 | ||
62 | BUG_ON(!PageLocked(page)); | 61 | BUG_ON(!PageLocked(page)); |
@@ -65,16 +64,16 @@ static int v9fs_fid_readpage(struct p9_fid *fid, struct page *page) | |||
65 | if (retval == 0) | 64 | if (retval == 0) |
66 | return retval; | 65 | return retval; |
67 | 66 | ||
68 | buffer = kmap(page); | 67 | iov_iter_bvec(&to, ITER_BVEC | READ, &bvec, 1, PAGE_SIZE); |
69 | offset = page_offset(page); | ||
70 | 68 | ||
71 | retval = v9fs_fid_readn(fid, buffer, NULL, PAGE_CACHE_SIZE, offset); | 69 | retval = p9_client_read(fid, page_offset(page), &to, &err); |
72 | if (retval < 0) { | 70 | if (err) { |
73 | v9fs_uncache_page(inode, page); | 71 | v9fs_uncache_page(inode, page); |
72 | retval = err; | ||
74 | goto done; | 73 | goto done; |
75 | } | 74 | } |
76 | 75 | ||
77 | memset(buffer + retval, 0, PAGE_CACHE_SIZE - retval); | 76 | zero_user(page, retval, PAGE_SIZE - retval); |
78 | flush_dcache_page(page); | 77 | flush_dcache_page(page); |
79 | SetPageUptodate(page); | 78 | SetPageUptodate(page); |
80 | 79 | ||
@@ -82,7 +81,6 @@ static int v9fs_fid_readpage(struct p9_fid *fid, struct page *page) | |||
82 | retval = 0; | 81 | retval = 0; |
83 | 82 | ||
84 | done: | 83 | done: |
85 | kunmap(page); | ||
86 | unlock_page(page); | 84 | unlock_page(page); |
87 | return retval; | 85 | return retval; |
88 | } | 86 | } |
@@ -161,41 +159,32 @@ static void v9fs_invalidate_page(struct page *page, unsigned int offset, | |||
161 | 159 | ||
162 | static int v9fs_vfs_writepage_locked(struct page *page) | 160 | static int v9fs_vfs_writepage_locked(struct page *page) |
163 | { | 161 | { |
164 | char *buffer; | ||
165 | int retval, len; | ||
166 | loff_t offset, size; | ||
167 | mm_segment_t old_fs; | ||
168 | struct v9fs_inode *v9inode; | ||
169 | struct inode *inode = page->mapping->host; | 162 | struct inode *inode = page->mapping->host; |
163 | struct v9fs_inode *v9inode = V9FS_I(inode); | ||
164 | loff_t size = i_size_read(inode); | ||
165 | struct iov_iter from; | ||
166 | struct bio_vec bvec; | ||
167 | int err, len; | ||
170 | 168 | ||
171 | v9inode = V9FS_I(inode); | ||
172 | size = i_size_read(inode); | ||
173 | if (page->index == size >> PAGE_CACHE_SHIFT) | 169 | if (page->index == size >> PAGE_CACHE_SHIFT) |
174 | len = size & ~PAGE_CACHE_MASK; | 170 | len = size & ~PAGE_CACHE_MASK; |
175 | else | 171 | else |
176 | len = PAGE_CACHE_SIZE; | 172 | len = PAGE_CACHE_SIZE; |
177 | 173 | ||
178 | set_page_writeback(page); | 174 | bvec.bv_page = page; |
179 | 175 | bvec.bv_offset = 0; | |
180 | buffer = kmap(page); | 176 | bvec.bv_len = len; |
181 | offset = page_offset(page); | 177 | iov_iter_bvec(&from, ITER_BVEC | WRITE, &bvec, 1, len); |
182 | 178 | ||
183 | old_fs = get_fs(); | ||
184 | set_fs(get_ds()); | ||
185 | /* We should have writeback_fid always set */ | 179 | /* We should have writeback_fid always set */ |
186 | BUG_ON(!v9inode->writeback_fid); | 180 | BUG_ON(!v9inode->writeback_fid); |
187 | 181 | ||
188 | retval = v9fs_file_write_internal(inode, | 182 | set_page_writeback(page); |
189 | v9inode->writeback_fid, | 183 | |
190 | (__force const char __user *)buffer, | 184 | p9_client_write(v9inode->writeback_fid, page_offset(page), &from, &err); |
191 | len, &offset, 0); | ||
192 | if (retval > 0) | ||
193 | retval = 0; | ||
194 | 185 | ||
195 | set_fs(old_fs); | ||
196 | kunmap(page); | ||
197 | end_page_writeback(page); | 186 | end_page_writeback(page); |
198 | return retval; | 187 | return err; |
199 | } | 188 | } |
200 | 189 | ||
201 | static int v9fs_vfs_writepage(struct page *page, struct writeback_control *wbc) | 190 | static int v9fs_vfs_writepage(struct page *page, struct writeback_control *wbc) |
@@ -261,16 +250,21 @@ static int v9fs_launder_page(struct page *page) | |||
261 | static ssize_t | 250 | static ssize_t |
262 | v9fs_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter, loff_t pos) | 251 | v9fs_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter, loff_t pos) |
263 | { | 252 | { |
264 | /* | 253 | struct file *file = iocb->ki_filp; |
265 | * FIXME | 254 | ssize_t n; |
266 | * Now that we do caching with cache mode enabled, We need | 255 | int err = 0; |
267 | * to support direct IO | 256 | if (rw & WRITE) { |
268 | */ | 257 | n = p9_client_write(file->private_data, pos, iter, &err); |
269 | p9_debug(P9_DEBUG_VFS, "v9fs_direct_IO: v9fs_direct_IO (%pD) off/no(%lld/%lu) EINVAL\n", | 258 | if (n) { |
270 | iocb->ki_filp, | 259 | struct inode *inode = file_inode(file); |
271 | (long long)pos, iter->nr_segs); | 260 | loff_t i_size = i_size_read(inode); |
272 | 261 | if (pos + n > i_size) | |
273 | return -EINVAL; | 262 | inode_add_bytes(inode, pos + n - i_size); |
263 | } | ||
264 | } else { | ||
265 | n = p9_client_read(file->private_data, pos, iter, &err); | ||
266 | } | ||
267 | return n ? n : err; | ||
274 | } | 268 | } |
275 | 269 | ||
276 | static int v9fs_write_begin(struct file *filp, struct address_space *mapping, | 270 | static int v9fs_write_begin(struct file *filp, struct address_space *mapping, |
diff --git a/fs/9p/vfs_dir.c b/fs/9p/vfs_dir.c index 4f1151088ebe..76c3b1ab6361 100644 --- a/fs/9p/vfs_dir.c +++ b/fs/9p/vfs_dir.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/inet.h> | 33 | #include <linux/inet.h> |
34 | #include <linux/idr.h> | 34 | #include <linux/idr.h> |
35 | #include <linux/slab.h> | 35 | #include <linux/slab.h> |
36 | #include <linux/uio.h> | ||
36 | #include <net/9p/9p.h> | 37 | #include <net/9p/9p.h> |
37 | #include <net/9p/client.h> | 38 | #include <net/9p/client.h> |
38 | 39 | ||
@@ -115,6 +116,7 @@ static int v9fs_dir_readdir(struct file *file, struct dir_context *ctx) | |||
115 | int buflen; | 116 | int buflen; |
116 | int reclen = 0; | 117 | int reclen = 0; |
117 | struct p9_rdir *rdir; | 118 | struct p9_rdir *rdir; |
119 | struct kvec kvec; | ||
118 | 120 | ||
119 | p9_debug(P9_DEBUG_VFS, "name %pD\n", file); | 121 | p9_debug(P9_DEBUG_VFS, "name %pD\n", file); |
120 | fid = file->private_data; | 122 | fid = file->private_data; |
@@ -124,16 +126,21 @@ static int v9fs_dir_readdir(struct file *file, struct dir_context *ctx) | |||
124 | rdir = v9fs_alloc_rdir_buf(file, buflen); | 126 | rdir = v9fs_alloc_rdir_buf(file, buflen); |
125 | if (!rdir) | 127 | if (!rdir) |
126 | return -ENOMEM; | 128 | return -ENOMEM; |
129 | kvec.iov_base = rdir->buf; | ||
130 | kvec.iov_len = buflen; | ||
127 | 131 | ||
128 | while (1) { | 132 | while (1) { |
129 | if (rdir->tail == rdir->head) { | 133 | if (rdir->tail == rdir->head) { |
130 | err = v9fs_file_readn(file, rdir->buf, NULL, | 134 | struct iov_iter to; |
131 | buflen, ctx->pos); | 135 | int n; |
132 | if (err <= 0) | 136 | iov_iter_kvec(&to, READ | ITER_KVEC, &kvec, 1, buflen); |
137 | n = p9_client_read(file->private_data, ctx->pos, &to, | ||
138 | &err); | ||
139 | if (err) | ||
133 | return err; | 140 | return err; |
134 | 141 | ||
135 | rdir->head = 0; | 142 | rdir->head = 0; |
136 | rdir->tail = err; | 143 | rdir->tail = n; |
137 | } | 144 | } |
138 | while (rdir->head < rdir->tail) { | 145 | while (rdir->head < rdir->tail) { |
139 | p9stat_init(&st); | 146 | p9stat_init(&st); |
diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c index b40133796b87..d7fcb775311e 100644 --- a/fs/9p/vfs_file.c +++ b/fs/9p/vfs_file.c | |||
@@ -36,6 +36,8 @@ | |||
36 | #include <linux/utsname.h> | 36 | #include <linux/utsname.h> |
37 | #include <asm/uaccess.h> | 37 | #include <asm/uaccess.h> |
38 | #include <linux/idr.h> | 38 | #include <linux/idr.h> |
39 | #include <linux/uio.h> | ||
40 | #include <linux/slab.h> | ||
39 | #include <net/9p/9p.h> | 41 | #include <net/9p/9p.h> |
40 | #include <net/9p/client.h> | 42 | #include <net/9p/client.h> |
41 | 43 | ||
@@ -285,6 +287,7 @@ static int v9fs_file_getlock(struct file *filp, struct file_lock *fl) | |||
285 | fl->fl_end = glock.start + glock.length - 1; | 287 | fl->fl_end = glock.start + glock.length - 1; |
286 | fl->fl_pid = glock.proc_id; | 288 | fl->fl_pid = glock.proc_id; |
287 | } | 289 | } |
290 | kfree(glock.client_id); | ||
288 | return res; | 291 | return res; |
289 | } | 292 | } |
290 | 293 | ||
@@ -364,63 +367,6 @@ out_err: | |||
364 | } | 367 | } |
365 | 368 | ||
366 | /** | 369 | /** |
367 | * v9fs_fid_readn - read from a fid | ||
368 | * @fid: fid to read | ||
369 | * @data: data buffer to read data into | ||
370 | * @udata: user data buffer to read data into | ||
371 | * @count: size of buffer | ||
372 | * @offset: offset at which to read data | ||
373 | * | ||
374 | */ | ||
375 | ssize_t | ||
376 | v9fs_fid_readn(struct p9_fid *fid, char *data, char __user *udata, u32 count, | ||
377 | u64 offset) | ||
378 | { | ||
379 | int n, total, size; | ||
380 | |||
381 | p9_debug(P9_DEBUG_VFS, "fid %d offset %llu count %d\n", | ||
382 | fid->fid, (long long unsigned)offset, count); | ||
383 | n = 0; | ||
384 | total = 0; | ||
385 | size = fid->iounit ? fid->iounit : fid->clnt->msize - P9_IOHDRSZ; | ||
386 | do { | ||
387 | n = p9_client_read(fid, data, udata, offset, count); | ||
388 | if (n <= 0) | ||
389 | break; | ||
390 | |||
391 | if (data) | ||
392 | data += n; | ||
393 | if (udata) | ||
394 | udata += n; | ||
395 | |||
396 | offset += n; | ||
397 | count -= n; | ||
398 | total += n; | ||
399 | } while (count > 0 && n == size); | ||
400 | |||
401 | if (n < 0) | ||
402 | total = n; | ||
403 | |||
404 | return total; | ||
405 | } | ||
406 | |||
407 | /** | ||
408 | * v9fs_file_readn - read from a file | ||
409 | * @filp: file pointer to read | ||
410 | * @data: data buffer to read data into | ||
411 | * @udata: user data buffer to read data into | ||
412 | * @count: size of buffer | ||
413 | * @offset: offset at which to read data | ||
414 | * | ||
415 | */ | ||
416 | ssize_t | ||
417 | v9fs_file_readn(struct file *filp, char *data, char __user *udata, u32 count, | ||
418 | u64 offset) | ||
419 | { | ||
420 | return v9fs_fid_readn(filp->private_data, data, udata, count, offset); | ||
421 | } | ||
422 | |||
423 | /** | ||
424 | * v9fs_file_read - read from a file | 370 | * v9fs_file_read - read from a file |
425 | * @filp: file pointer to read | 371 | * @filp: file pointer to read |
426 | * @udata: user data buffer to read data into | 372 | * @udata: user data buffer to read data into |
@@ -430,69 +376,22 @@ v9fs_file_readn(struct file *filp, char *data, char __user *udata, u32 count, | |||
430 | */ | 376 | */ |
431 | 377 | ||
432 | static ssize_t | 378 | static ssize_t |
433 | v9fs_file_read(struct file *filp, char __user *udata, size_t count, | 379 | v9fs_file_read_iter(struct kiocb *iocb, struct iov_iter *to) |
434 | loff_t * offset) | ||
435 | { | 380 | { |
436 | int ret; | 381 | struct p9_fid *fid = iocb->ki_filp->private_data; |
437 | struct p9_fid *fid; | 382 | int ret, err; |
438 | size_t size; | ||
439 | 383 | ||
440 | p9_debug(P9_DEBUG_VFS, "count %zu offset %lld\n", count, *offset); | 384 | p9_debug(P9_DEBUG_VFS, "count %zu offset %lld\n", |
441 | fid = filp->private_data; | 385 | iov_iter_count(to), iocb->ki_pos); |
442 | 386 | ||
443 | size = fid->iounit ? fid->iounit : fid->clnt->msize - P9_IOHDRSZ; | 387 | ret = p9_client_read(fid, iocb->ki_pos, to, &err); |
444 | if (count > size) | 388 | if (!ret) |
445 | ret = v9fs_file_readn(filp, NULL, udata, count, *offset); | 389 | return err; |
446 | else | ||
447 | ret = p9_client_read(fid, NULL, udata, *offset, count); | ||
448 | |||
449 | if (ret > 0) | ||
450 | *offset += ret; | ||
451 | 390 | ||
391 | iocb->ki_pos += ret; | ||
452 | return ret; | 392 | return ret; |
453 | } | 393 | } |
454 | 394 | ||
455 | ssize_t | ||
456 | v9fs_file_write_internal(struct inode *inode, struct p9_fid *fid, | ||
457 | const char __user *data, size_t count, | ||
458 | loff_t *offset, int invalidate) | ||
459 | { | ||
460 | int n; | ||
461 | loff_t i_size; | ||
462 | size_t total = 0; | ||
463 | loff_t origin = *offset; | ||
464 | unsigned long pg_start, pg_end; | ||
465 | |||
466 | p9_debug(P9_DEBUG_VFS, "data %p count %d offset %x\n", | ||
467 | data, (int)count, (int)*offset); | ||
468 | |||
469 | do { | ||
470 | n = p9_client_write(fid, NULL, data+total, origin+total, count); | ||
471 | if (n <= 0) | ||
472 | break; | ||
473 | count -= n; | ||
474 | total += n; | ||
475 | } while (count > 0); | ||
476 | |||
477 | if (invalidate && (total > 0)) { | ||
478 | pg_start = origin >> PAGE_CACHE_SHIFT; | ||
479 | pg_end = (origin + total - 1) >> PAGE_CACHE_SHIFT; | ||
480 | if (inode->i_mapping && inode->i_mapping->nrpages) | ||
481 | invalidate_inode_pages2_range(inode->i_mapping, | ||
482 | pg_start, pg_end); | ||
483 | *offset += total; | ||
484 | i_size = i_size_read(inode); | ||
485 | if (*offset > i_size) { | ||
486 | inode_add_bytes(inode, *offset - i_size); | ||
487 | i_size_write(inode, *offset); | ||
488 | } | ||
489 | } | ||
490 | if (n < 0) | ||
491 | return n; | ||
492 | |||
493 | return total; | ||
494 | } | ||
495 | |||
496 | /** | 395 | /** |
497 | * v9fs_file_write - write to a file | 396 | * v9fs_file_write - write to a file |
498 | * @filp: file pointer to write | 397 | * @filp: file pointer to write |
@@ -502,35 +401,45 @@ v9fs_file_write_internal(struct inode *inode, struct p9_fid *fid, | |||
502 | * | 401 | * |
503 | */ | 402 | */ |
504 | static ssize_t | 403 | static ssize_t |
505 | v9fs_file_write(struct file *filp, const char __user * data, | 404 | v9fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) |
506 | size_t count, loff_t *offset) | ||
507 | { | 405 | { |
406 | struct file *file = iocb->ki_filp; | ||
508 | ssize_t retval = 0; | 407 | ssize_t retval = 0; |
509 | loff_t origin = *offset; | 408 | loff_t origin = iocb->ki_pos; |
409 | size_t count = iov_iter_count(from); | ||
410 | int err = 0; | ||
510 | 411 | ||
511 | 412 | retval = generic_write_checks(file, &origin, &count, 0); | |
512 | retval = generic_write_checks(filp, &origin, &count, 0); | ||
513 | if (retval) | 413 | if (retval) |
514 | goto out; | 414 | return retval; |
415 | |||
416 | iov_iter_truncate(from, count); | ||
515 | 417 | ||
516 | retval = -EINVAL; | ||
517 | if ((ssize_t) count < 0) | ||
518 | goto out; | ||
519 | retval = 0; | ||
520 | if (!count) | 418 | if (!count) |
521 | goto out; | 419 | return 0; |
522 | 420 | ||
523 | retval = v9fs_file_write_internal(file_inode(filp), | 421 | retval = p9_client_write(file->private_data, origin, from, &err); |
524 | filp->private_data, | 422 | if (retval > 0) { |
525 | data, count, &origin, 1); | 423 | struct inode *inode = file_inode(file); |
526 | /* update offset on successful write */ | 424 | loff_t i_size; |
527 | if (retval > 0) | 425 | unsigned long pg_start, pg_end; |
528 | *offset = origin; | 426 | pg_start = origin >> PAGE_CACHE_SHIFT; |
529 | out: | 427 | pg_end = (origin + retval - 1) >> PAGE_CACHE_SHIFT; |
530 | return retval; | 428 | if (inode->i_mapping && inode->i_mapping->nrpages) |
429 | invalidate_inode_pages2_range(inode->i_mapping, | ||
430 | pg_start, pg_end); | ||
431 | origin += retval; | ||
432 | i_size = i_size_read(inode); | ||
433 | iocb->ki_pos = origin; | ||
434 | if (origin > i_size) { | ||
435 | inode_add_bytes(inode, origin - i_size); | ||
436 | i_size_write(inode, origin); | ||
437 | } | ||
438 | return retval; | ||
439 | } | ||
440 | return err; | ||
531 | } | 441 | } |
532 | 442 | ||
533 | |||
534 | static int v9fs_file_fsync(struct file *filp, loff_t start, loff_t end, | 443 | static int v9fs_file_fsync(struct file *filp, loff_t start, loff_t end, |
535 | int datasync) | 444 | int datasync) |
536 | { | 445 | { |
@@ -657,44 +566,6 @@ out_unlock: | |||
657 | return VM_FAULT_NOPAGE; | 566 | return VM_FAULT_NOPAGE; |
658 | } | 567 | } |
659 | 568 | ||
660 | static ssize_t | ||
661 | v9fs_direct_read(struct file *filp, char __user *udata, size_t count, | ||
662 | loff_t *offsetp) | ||
663 | { | ||
664 | loff_t size, offset; | ||
665 | struct inode *inode; | ||
666 | struct address_space *mapping; | ||
667 | |||
668 | offset = *offsetp; | ||
669 | mapping = filp->f_mapping; | ||
670 | inode = mapping->host; | ||
671 | if (!count) | ||
672 | return 0; | ||
673 | size = i_size_read(inode); | ||
674 | if (offset < size) | ||
675 | filemap_write_and_wait_range(mapping, offset, | ||
676 | offset + count - 1); | ||
677 | |||
678 | return v9fs_file_read(filp, udata, count, offsetp); | ||
679 | } | ||
680 | |||
681 | /** | ||
682 | * v9fs_cached_file_read - read from a file | ||
683 | * @filp: file pointer to read | ||
684 | * @data: user data buffer to read data into | ||
685 | * @count: size of buffer | ||
686 | * @offset: offset at which to read data | ||
687 | * | ||
688 | */ | ||
689 | static ssize_t | ||
690 | v9fs_cached_file_read(struct file *filp, char __user *data, size_t count, | ||
691 | loff_t *offset) | ||
692 | { | ||
693 | if (filp->f_flags & O_DIRECT) | ||
694 | return v9fs_direct_read(filp, data, count, offset); | ||
695 | return new_sync_read(filp, data, count, offset); | ||
696 | } | ||
697 | |||
698 | /** | 569 | /** |
699 | * v9fs_mmap_file_read - read from a file | 570 | * v9fs_mmap_file_read - read from a file |
700 | * @filp: file pointer to read | 571 | * @filp: file pointer to read |
@@ -704,84 +575,12 @@ v9fs_cached_file_read(struct file *filp, char __user *data, size_t count, | |||
704 | * | 575 | * |
705 | */ | 576 | */ |
706 | static ssize_t | 577 | static ssize_t |
707 | v9fs_mmap_file_read(struct file *filp, char __user *data, size_t count, | 578 | v9fs_mmap_file_read_iter(struct kiocb *iocb, struct iov_iter *to) |
708 | loff_t *offset) | ||
709 | { | 579 | { |
710 | /* TODO: Check if there are dirty pages */ | 580 | /* TODO: Check if there are dirty pages */ |
711 | return v9fs_file_read(filp, data, count, offset); | 581 | return v9fs_file_read_iter(iocb, to); |
712 | } | 582 | } |
713 | 583 | ||
714 | static ssize_t | ||
715 | v9fs_direct_write(struct file *filp, const char __user * data, | ||
716 | size_t count, loff_t *offsetp) | ||
717 | { | ||
718 | loff_t offset; | ||
719 | ssize_t retval; | ||
720 | struct inode *inode; | ||
721 | struct address_space *mapping; | ||
722 | |||
723 | offset = *offsetp; | ||
724 | mapping = filp->f_mapping; | ||
725 | inode = mapping->host; | ||
726 | if (!count) | ||
727 | return 0; | ||
728 | |||
729 | mutex_lock(&inode->i_mutex); | ||
730 | retval = filemap_write_and_wait_range(mapping, offset, | ||
731 | offset + count - 1); | ||
732 | if (retval) | ||
733 | goto err_out; | ||
734 | /* | ||
735 | * After a write we want buffered reads to be sure to go to disk to get | ||
736 | * the new data. We invalidate clean cached page from the region we're | ||
737 | * about to write. We do this *before* the write so that if we fail | ||
738 | * here we fall back to buffered write | ||
739 | */ | ||
740 | if (mapping->nrpages) { | ||
741 | pgoff_t pg_start = offset >> PAGE_CACHE_SHIFT; | ||
742 | pgoff_t pg_end = (offset + count - 1) >> PAGE_CACHE_SHIFT; | ||
743 | |||
744 | retval = invalidate_inode_pages2_range(mapping, | ||
745 | pg_start, pg_end); | ||
746 | /* | ||
747 | * If a page can not be invalidated, fall back | ||
748 | * to buffered write. | ||
749 | */ | ||
750 | if (retval) { | ||
751 | if (retval == -EBUSY) | ||
752 | goto buff_write; | ||
753 | goto err_out; | ||
754 | } | ||
755 | } | ||
756 | retval = v9fs_file_write(filp, data, count, offsetp); | ||
757 | err_out: | ||
758 | mutex_unlock(&inode->i_mutex); | ||
759 | return retval; | ||
760 | |||
761 | buff_write: | ||
762 | mutex_unlock(&inode->i_mutex); | ||
763 | return new_sync_write(filp, data, count, offsetp); | ||
764 | } | ||
765 | |||
766 | /** | ||
767 | * v9fs_cached_file_write - write to a file | ||
768 | * @filp: file pointer to write | ||
769 | * @data: data buffer to write data from | ||
770 | * @count: size of buffer | ||
771 | * @offset: offset at which to write data | ||
772 | * | ||
773 | */ | ||
774 | static ssize_t | ||
775 | v9fs_cached_file_write(struct file *filp, const char __user * data, | ||
776 | size_t count, loff_t *offset) | ||
777 | { | ||
778 | |||
779 | if (filp->f_flags & O_DIRECT) | ||
780 | return v9fs_direct_write(filp, data, count, offset); | ||
781 | return new_sync_write(filp, data, count, offset); | ||
782 | } | ||
783 | |||
784 | |||
785 | /** | 584 | /** |
786 | * v9fs_mmap_file_write - write to a file | 585 | * v9fs_mmap_file_write - write to a file |
787 | * @filp: file pointer to write | 586 | * @filp: file pointer to write |
@@ -791,14 +590,13 @@ v9fs_cached_file_write(struct file *filp, const char __user * data, | |||
791 | * | 590 | * |
792 | */ | 591 | */ |
793 | static ssize_t | 592 | static ssize_t |
794 | v9fs_mmap_file_write(struct file *filp, const char __user *data, | 593 | v9fs_mmap_file_write_iter(struct kiocb *iocb, struct iov_iter *from) |
795 | size_t count, loff_t *offset) | ||
796 | { | 594 | { |
797 | /* | 595 | /* |
798 | * TODO: invalidate mmaps on filp's inode between | 596 | * TODO: invalidate mmaps on filp's inode between |
799 | * offset and offset+count | 597 | * offset and offset+count |
800 | */ | 598 | */ |
801 | return v9fs_file_write(filp, data, count, offset); | 599 | return v9fs_file_write_iter(iocb, from); |
802 | } | 600 | } |
803 | 601 | ||
804 | static void v9fs_mmap_vm_close(struct vm_area_struct *vma) | 602 | static void v9fs_mmap_vm_close(struct vm_area_struct *vma) |
@@ -843,8 +641,6 @@ static const struct vm_operations_struct v9fs_mmap_file_vm_ops = { | |||
843 | 641 | ||
844 | const struct file_operations v9fs_cached_file_operations = { | 642 | const struct file_operations v9fs_cached_file_operations = { |
845 | .llseek = generic_file_llseek, | 643 | .llseek = generic_file_llseek, |
846 | .read = v9fs_cached_file_read, | ||
847 | .write = v9fs_cached_file_write, | ||
848 | .read_iter = generic_file_read_iter, | 644 | .read_iter = generic_file_read_iter, |
849 | .write_iter = generic_file_write_iter, | 645 | .write_iter = generic_file_write_iter, |
850 | .open = v9fs_file_open, | 646 | .open = v9fs_file_open, |
@@ -856,8 +652,6 @@ const struct file_operations v9fs_cached_file_operations = { | |||
856 | 652 | ||
857 | const struct file_operations v9fs_cached_file_operations_dotl = { | 653 | const struct file_operations v9fs_cached_file_operations_dotl = { |
858 | .llseek = generic_file_llseek, | 654 | .llseek = generic_file_llseek, |
859 | .read = v9fs_cached_file_read, | ||
860 | .write = v9fs_cached_file_write, | ||
861 | .read_iter = generic_file_read_iter, | 655 | .read_iter = generic_file_read_iter, |
862 | .write_iter = generic_file_write_iter, | 656 | .write_iter = generic_file_write_iter, |
863 | .open = v9fs_file_open, | 657 | .open = v9fs_file_open, |
@@ -870,8 +664,8 @@ const struct file_operations v9fs_cached_file_operations_dotl = { | |||
870 | 664 | ||
871 | const struct file_operations v9fs_file_operations = { | 665 | const struct file_operations v9fs_file_operations = { |
872 | .llseek = generic_file_llseek, | 666 | .llseek = generic_file_llseek, |
873 | .read = v9fs_file_read, | 667 | .read_iter = v9fs_file_read_iter, |
874 | .write = v9fs_file_write, | 668 | .write_iter = v9fs_file_write_iter, |
875 | .open = v9fs_file_open, | 669 | .open = v9fs_file_open, |
876 | .release = v9fs_dir_release, | 670 | .release = v9fs_dir_release, |
877 | .lock = v9fs_file_lock, | 671 | .lock = v9fs_file_lock, |
@@ -881,8 +675,8 @@ const struct file_operations v9fs_file_operations = { | |||
881 | 675 | ||
882 | const struct file_operations v9fs_file_operations_dotl = { | 676 | const struct file_operations v9fs_file_operations_dotl = { |
883 | .llseek = generic_file_llseek, | 677 | .llseek = generic_file_llseek, |
884 | .read = v9fs_file_read, | 678 | .read_iter = v9fs_file_read_iter, |
885 | .write = v9fs_file_write, | 679 | .write_iter = v9fs_file_write_iter, |
886 | .open = v9fs_file_open, | 680 | .open = v9fs_file_open, |
887 | .release = v9fs_dir_release, | 681 | .release = v9fs_dir_release, |
888 | .lock = v9fs_file_lock_dotl, | 682 | .lock = v9fs_file_lock_dotl, |
@@ -893,8 +687,8 @@ const struct file_operations v9fs_file_operations_dotl = { | |||
893 | 687 | ||
894 | const struct file_operations v9fs_mmap_file_operations = { | 688 | const struct file_operations v9fs_mmap_file_operations = { |
895 | .llseek = generic_file_llseek, | 689 | .llseek = generic_file_llseek, |
896 | .read = v9fs_mmap_file_read, | 690 | .read_iter = v9fs_mmap_file_read_iter, |
897 | .write = v9fs_mmap_file_write, | 691 | .write_iter = v9fs_mmap_file_write_iter, |
898 | .open = v9fs_file_open, | 692 | .open = v9fs_file_open, |
899 | .release = v9fs_dir_release, | 693 | .release = v9fs_dir_release, |
900 | .lock = v9fs_file_lock, | 694 | .lock = v9fs_file_lock, |
@@ -904,8 +698,8 @@ const struct file_operations v9fs_mmap_file_operations = { | |||
904 | 698 | ||
905 | const struct file_operations v9fs_mmap_file_operations_dotl = { | 699 | const struct file_operations v9fs_mmap_file_operations_dotl = { |
906 | .llseek = generic_file_llseek, | 700 | .llseek = generic_file_llseek, |
907 | .read = v9fs_mmap_file_read, | 701 | .read_iter = v9fs_mmap_file_read_iter, |
908 | .write = v9fs_mmap_file_write, | 702 | .write_iter = v9fs_mmap_file_write_iter, |
909 | .open = v9fs_file_open, | 703 | .open = v9fs_file_open, |
910 | .release = v9fs_dir_release, | 704 | .release = v9fs_dir_release, |
911 | .lock = v9fs_file_lock_dotl, | 705 | .lock = v9fs_file_lock_dotl, |
diff --git a/fs/9p/xattr.c b/fs/9p/xattr.c index f95e01e058e4..0cf44b6cccd6 100644 --- a/fs/9p/xattr.c +++ b/fs/9p/xattr.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/module.h> | 15 | #include <linux/module.h> |
16 | #include <linux/fs.h> | 16 | #include <linux/fs.h> |
17 | #include <linux/sched.h> | 17 | #include <linux/sched.h> |
18 | #include <linux/uio.h> | ||
18 | #include <net/9p/9p.h> | 19 | #include <net/9p/9p.h> |
19 | #include <net/9p/client.h> | 20 | #include <net/9p/client.h> |
20 | 21 | ||
@@ -25,50 +26,34 @@ ssize_t v9fs_fid_xattr_get(struct p9_fid *fid, const char *name, | |||
25 | void *buffer, size_t buffer_size) | 26 | void *buffer, size_t buffer_size) |
26 | { | 27 | { |
27 | ssize_t retval; | 28 | ssize_t retval; |
28 | int msize, read_count; | 29 | u64 attr_size; |
29 | u64 offset = 0, attr_size; | ||
30 | struct p9_fid *attr_fid; | 30 | struct p9_fid *attr_fid; |
31 | struct kvec kvec = {.iov_base = buffer, .iov_len = buffer_size}; | ||
32 | struct iov_iter to; | ||
33 | int err; | ||
34 | |||
35 | iov_iter_kvec(&to, READ | ITER_KVEC, &kvec, 1, buffer_size); | ||
31 | 36 | ||
32 | attr_fid = p9_client_xattrwalk(fid, name, &attr_size); | 37 | attr_fid = p9_client_xattrwalk(fid, name, &attr_size); |
33 | if (IS_ERR(attr_fid)) { | 38 | if (IS_ERR(attr_fid)) { |
34 | retval = PTR_ERR(attr_fid); | 39 | retval = PTR_ERR(attr_fid); |
35 | p9_debug(P9_DEBUG_VFS, "p9_client_attrwalk failed %zd\n", | 40 | p9_debug(P9_DEBUG_VFS, "p9_client_attrwalk failed %zd\n", |
36 | retval); | 41 | retval); |
37 | attr_fid = NULL; | 42 | return retval; |
38 | goto error; | ||
39 | } | ||
40 | if (!buffer_size) { | ||
41 | /* request to get the attr_size */ | ||
42 | retval = attr_size; | ||
43 | goto error; | ||
44 | } | 43 | } |
45 | if (attr_size > buffer_size) { | 44 | if (attr_size > buffer_size) { |
46 | retval = -ERANGE; | 45 | if (!buffer_size) /* request to get the attr_size */ |
47 | goto error; | 46 | retval = attr_size; |
48 | } | ||
49 | msize = attr_fid->clnt->msize; | ||
50 | while (attr_size) { | ||
51 | if (attr_size > (msize - P9_IOHDRSZ)) | ||
52 | read_count = msize - P9_IOHDRSZ; | ||
53 | else | 47 | else |
54 | read_count = attr_size; | 48 | retval = -ERANGE; |
55 | read_count = p9_client_read(attr_fid, ((char *)buffer)+offset, | 49 | } else { |
56 | NULL, offset, read_count); | 50 | iov_iter_truncate(&to, attr_size); |
57 | if (read_count < 0) { | 51 | retval = p9_client_read(attr_fid, 0, &to, &err); |
58 | /* error in xattr read */ | 52 | if (err) |
59 | retval = read_count; | 53 | retval = err; |
60 | goto error; | ||
61 | } | ||
62 | offset += read_count; | ||
63 | attr_size -= read_count; | ||
64 | } | 54 | } |
65 | /* Total read xattr bytes */ | 55 | p9_client_clunk(attr_fid); |
66 | retval = offset; | ||
67 | error: | ||
68 | if (attr_fid) | ||
69 | p9_client_clunk(attr_fid); | ||
70 | return retval; | 56 | return retval; |
71 | |||
72 | } | 57 | } |
73 | 58 | ||
74 | 59 | ||
@@ -120,8 +105,11 @@ int v9fs_xattr_set(struct dentry *dentry, const char *name, | |||
120 | int v9fs_fid_xattr_set(struct p9_fid *fid, const char *name, | 105 | int v9fs_fid_xattr_set(struct p9_fid *fid, const char *name, |
121 | const void *value, size_t value_len, int flags) | 106 | const void *value, size_t value_len, int flags) |
122 | { | 107 | { |
123 | u64 offset = 0; | 108 | struct kvec kvec = {.iov_base = (void *)value, .iov_len = value_len}; |
124 | int retval, msize, write_count; | 109 | struct iov_iter from; |
110 | int retval; | ||
111 | |||
112 | iov_iter_kvec(&from, WRITE | ITER_KVEC, &kvec, 1, value_len); | ||
125 | 113 | ||
126 | p9_debug(P9_DEBUG_VFS, "name = %s value_len = %zu flags = %d\n", | 114 | p9_debug(P9_DEBUG_VFS, "name = %s value_len = %zu flags = %d\n", |
127 | name, value_len, flags); | 115 | name, value_len, flags); |
@@ -135,29 +123,11 @@ int v9fs_fid_xattr_set(struct p9_fid *fid, const char *name, | |||
135 | * On success fid points to xattr | 123 | * On success fid points to xattr |
136 | */ | 124 | */ |
137 | retval = p9_client_xattrcreate(fid, name, value_len, flags); | 125 | retval = p9_client_xattrcreate(fid, name, value_len, flags); |
138 | if (retval < 0) { | 126 | if (retval < 0) |
139 | p9_debug(P9_DEBUG_VFS, "p9_client_xattrcreate failed %d\n", | 127 | p9_debug(P9_DEBUG_VFS, "p9_client_xattrcreate failed %d\n", |
140 | retval); | 128 | retval); |
141 | goto err; | 129 | else |
142 | } | 130 | p9_client_write(fid, 0, &from, &retval); |
143 | msize = fid->clnt->msize; | ||
144 | while (value_len) { | ||
145 | if (value_len > (msize - P9_IOHDRSZ)) | ||
146 | write_count = msize - P9_IOHDRSZ; | ||
147 | else | ||
148 | write_count = value_len; | ||
149 | write_count = p9_client_write(fid, ((char *)value)+offset, | ||
150 | NULL, offset, write_count); | ||
151 | if (write_count < 0) { | ||
152 | /* error in xattr write */ | ||
153 | retval = write_count; | ||
154 | goto err; | ||
155 | } | ||
156 | offset += write_count; | ||
157 | value_len -= write_count; | ||
158 | } | ||
159 | retval = 0; | ||
160 | err: | ||
161 | p9_client_clunk(fid); | 131 | p9_client_clunk(fid); |
162 | return retval; | 132 | return retval; |
163 | } | 133 | } |
diff --git a/fs/adfs/file.c b/fs/adfs/file.c index 07c9edce5aa7..46c0d5671cd5 100644 --- a/fs/adfs/file.c +++ b/fs/adfs/file.c | |||
@@ -23,11 +23,9 @@ | |||
23 | 23 | ||
24 | const struct file_operations adfs_file_operations = { | 24 | const struct file_operations adfs_file_operations = { |
25 | .llseek = generic_file_llseek, | 25 | .llseek = generic_file_llseek, |
26 | .read = new_sync_read, | ||
27 | .read_iter = generic_file_read_iter, | 26 | .read_iter = generic_file_read_iter, |
28 | .mmap = generic_file_mmap, | 27 | .mmap = generic_file_mmap, |
29 | .fsync = generic_file_fsync, | 28 | .fsync = generic_file_fsync, |
30 | .write = new_sync_write, | ||
31 | .write_iter = generic_file_write_iter, | 29 | .write_iter = generic_file_write_iter, |
32 | .splice_read = generic_file_splice_read, | 30 | .splice_read = generic_file_splice_read, |
33 | }; | 31 | }; |
diff --git a/fs/affs/file.c b/fs/affs/file.c index 3aa7eb66547e..7c1a3d4c19c2 100644 --- a/fs/affs/file.c +++ b/fs/affs/file.c | |||
@@ -969,9 +969,7 @@ int affs_file_fsync(struct file *filp, loff_t start, loff_t end, int datasync) | |||
969 | } | 969 | } |
970 | const struct file_operations affs_file_operations = { | 970 | const struct file_operations affs_file_operations = { |
971 | .llseek = generic_file_llseek, | 971 | .llseek = generic_file_llseek, |
972 | .read = new_sync_read, | ||
973 | .read_iter = generic_file_read_iter, | 972 | .read_iter = generic_file_read_iter, |
974 | .write = new_sync_write, | ||
975 | .write_iter = generic_file_write_iter, | 973 | .write_iter = generic_file_write_iter, |
976 | .mmap = generic_file_mmap, | 974 | .mmap = generic_file_mmap, |
977 | .open = affs_file_open, | 975 | .open = affs_file_open, |
diff --git a/fs/afs/file.c b/fs/afs/file.c index 932ce07948b3..999bc3caec92 100644 --- a/fs/afs/file.c +++ b/fs/afs/file.c | |||
@@ -31,8 +31,6 @@ const struct file_operations afs_file_operations = { | |||
31 | .open = afs_open, | 31 | .open = afs_open, |
32 | .release = afs_release, | 32 | .release = afs_release, |
33 | .llseek = generic_file_llseek, | 33 | .llseek = generic_file_llseek, |
34 | .read = new_sync_read, | ||
35 | .write = new_sync_write, | ||
36 | .read_iter = generic_file_read_iter, | 34 | .read_iter = generic_file_read_iter, |
37 | .write_iter = afs_file_write, | 35 | .write_iter = afs_file_write, |
38 | .mmap = generic_file_readonly_mmap, | 36 | .mmap = generic_file_readonly_mmap, |
@@ -692,8 +692,7 @@ static struct kioctx *ioctx_alloc(unsigned nr_events) | |||
692 | nr_events *= 2; | 692 | nr_events *= 2; |
693 | 693 | ||
694 | /* Prevent overflows */ | 694 | /* Prevent overflows */ |
695 | if ((nr_events > (0x10000000U / sizeof(struct io_event))) || | 695 | if (nr_events > (0x10000000U / sizeof(struct io_event))) { |
696 | (nr_events > (0x10000000U / sizeof(struct kiocb)))) { | ||
697 | pr_debug("ENOMEM: nr_events too high\n"); | 696 | pr_debug("ENOMEM: nr_events too high\n"); |
698 | return ERR_PTR(-EINVAL); | 697 | return ERR_PTR(-EINVAL); |
699 | } | 698 | } |
@@ -1356,8 +1355,6 @@ SYSCALL_DEFINE1(io_destroy, aio_context_t, ctx) | |||
1356 | return -EINVAL; | 1355 | return -EINVAL; |
1357 | } | 1356 | } |
1358 | 1357 | ||
1359 | typedef ssize_t (aio_rw_op)(struct kiocb *, const struct iovec *, | ||
1360 | unsigned long, loff_t); | ||
1361 | typedef ssize_t (rw_iter_op)(struct kiocb *, struct iov_iter *); | 1358 | typedef ssize_t (rw_iter_op)(struct kiocb *, struct iov_iter *); |
1362 | 1359 | ||
1363 | static int aio_setup_vectored_rw(int rw, char __user *buf, size_t len, | 1360 | static int aio_setup_vectored_rw(int rw, char __user *buf, size_t len, |
@@ -1386,7 +1383,6 @@ static ssize_t aio_run_iocb(struct kiocb *req, unsigned opcode, | |||
1386 | ssize_t ret; | 1383 | ssize_t ret; |
1387 | int rw; | 1384 | int rw; |
1388 | fmode_t mode; | 1385 | fmode_t mode; |
1389 | aio_rw_op *rw_op; | ||
1390 | rw_iter_op *iter_op; | 1386 | rw_iter_op *iter_op; |
1391 | struct iovec inline_vecs[UIO_FASTIOV], *iovec = inline_vecs; | 1387 | struct iovec inline_vecs[UIO_FASTIOV], *iovec = inline_vecs; |
1392 | struct iov_iter iter; | 1388 | struct iov_iter iter; |
@@ -1396,7 +1392,6 @@ static ssize_t aio_run_iocb(struct kiocb *req, unsigned opcode, | |||
1396 | case IOCB_CMD_PREADV: | 1392 | case IOCB_CMD_PREADV: |
1397 | mode = FMODE_READ; | 1393 | mode = FMODE_READ; |
1398 | rw = READ; | 1394 | rw = READ; |
1399 | rw_op = file->f_op->aio_read; | ||
1400 | iter_op = file->f_op->read_iter; | 1395 | iter_op = file->f_op->read_iter; |
1401 | goto rw_common; | 1396 | goto rw_common; |
1402 | 1397 | ||
@@ -1404,14 +1399,13 @@ static ssize_t aio_run_iocb(struct kiocb *req, unsigned opcode, | |||
1404 | case IOCB_CMD_PWRITEV: | 1399 | case IOCB_CMD_PWRITEV: |
1405 | mode = FMODE_WRITE; | 1400 | mode = FMODE_WRITE; |
1406 | rw = WRITE; | 1401 | rw = WRITE; |
1407 | rw_op = file->f_op->aio_write; | ||
1408 | iter_op = file->f_op->write_iter; | 1402 | iter_op = file->f_op->write_iter; |
1409 | goto rw_common; | 1403 | goto rw_common; |
1410 | rw_common: | 1404 | rw_common: |
1411 | if (unlikely(!(file->f_mode & mode))) | 1405 | if (unlikely(!(file->f_mode & mode))) |
1412 | return -EBADF; | 1406 | return -EBADF; |
1413 | 1407 | ||
1414 | if (!rw_op && !iter_op) | 1408 | if (!iter_op) |
1415 | return -EINVAL; | 1409 | return -EINVAL; |
1416 | 1410 | ||
1417 | if (opcode == IOCB_CMD_PREADV || opcode == IOCB_CMD_PWRITEV) | 1411 | if (opcode == IOCB_CMD_PREADV || opcode == IOCB_CMD_PWRITEV) |
@@ -1431,21 +1425,10 @@ rw_common: | |||
1431 | 1425 | ||
1432 | len = ret; | 1426 | len = ret; |
1433 | 1427 | ||
1434 | /* XXX: move/kill - rw_verify_area()? */ | ||
1435 | /* This matches the pread()/pwrite() logic */ | ||
1436 | if (req->ki_pos < 0) { | ||
1437 | ret = -EINVAL; | ||
1438 | break; | ||
1439 | } | ||
1440 | |||
1441 | if (rw == WRITE) | 1428 | if (rw == WRITE) |
1442 | file_start_write(file); | 1429 | file_start_write(file); |
1443 | 1430 | ||
1444 | if (iter_op) { | 1431 | ret = iter_op(req, &iter); |
1445 | ret = iter_op(req, &iter); | ||
1446 | } else { | ||
1447 | ret = rw_op(req, iter.iov, iter.nr_segs, req->ki_pos); | ||
1448 | } | ||
1449 | 1432 | ||
1450 | if (rw == WRITE) | 1433 | if (rw == WRITE) |
1451 | file_end_write(file); | 1434 | file_end_write(file); |
diff --git a/fs/autofs4/autofs_i.h b/fs/autofs4/autofs_i.h index 8e98cf954bab..d10e619632ab 100644 --- a/fs/autofs4/autofs_i.h +++ b/fs/autofs4/autofs_i.h | |||
@@ -213,7 +213,7 @@ void autofs4_clean_ino(struct autofs_info *); | |||
213 | 213 | ||
214 | static inline int autofs_prepare_pipe(struct file *pipe) | 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 | return -EINVAL; | 217 | return -EINVAL; |
218 | if (!S_ISFIFO(file_inode(pipe)->i_mode)) | 218 | if (!S_ISFIFO(file_inode(pipe)->i_mode)) |
219 | return -EINVAL; | 219 | return -EINVAL; |
diff --git a/fs/autofs4/waitq.c b/fs/autofs4/waitq.c index 116fd38ee472..2ad05ab93db8 100644 --- a/fs/autofs4/waitq.c +++ b/fs/autofs4/waitq.c | |||
@@ -70,7 +70,7 @@ static int autofs4_write(struct autofs_sb_info *sbi, | |||
70 | 70 | ||
71 | mutex_lock(&sbi->pipe_mutex); | 71 | mutex_lock(&sbi->pipe_mutex); |
72 | while (bytes && | 72 | while (bytes && |
73 | (wr = file->f_op->write(file,data,bytes,&file->f_pos)) > 0) { | 73 | (wr = __vfs_write(file,data,bytes,&file->f_pos)) > 0) { |
74 | data += wr; | 74 | data += wr; |
75 | bytes -= wr; | 75 | bytes -= wr; |
76 | } | 76 | } |
diff --git a/fs/bfs/file.c b/fs/bfs/file.c index e7f88ace1a25..97f1b5160155 100644 --- a/fs/bfs/file.c +++ b/fs/bfs/file.c | |||
@@ -23,9 +23,7 @@ | |||
23 | 23 | ||
24 | const struct file_operations bfs_file_operations = { | 24 | const struct file_operations bfs_file_operations = { |
25 | .llseek = generic_file_llseek, | 25 | .llseek = generic_file_llseek, |
26 | .read = new_sync_read, | ||
27 | .read_iter = generic_file_read_iter, | 26 | .read_iter = generic_file_read_iter, |
28 | .write = new_sync_write, | ||
29 | .write_iter = generic_file_write_iter, | 27 | .write_iter = generic_file_write_iter, |
30 | .mmap = generic_file_mmap, | 28 | .mmap = generic_file_mmap, |
31 | .splice_read = generic_file_splice_read, | 29 | .splice_read = generic_file_splice_read, |
diff --git a/fs/block_dev.c b/fs/block_dev.c index 2e522aed6584..b5e87896f517 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
@@ -1659,8 +1659,6 @@ const struct file_operations def_blk_fops = { | |||
1659 | .open = blkdev_open, | 1659 | .open = blkdev_open, |
1660 | .release = blkdev_close, | 1660 | .release = blkdev_close, |
1661 | .llseek = block_llseek, | 1661 | .llseek = block_llseek, |
1662 | .read = new_sync_read, | ||
1663 | .write = new_sync_write, | ||
1664 | .read_iter = blkdev_read_iter, | 1662 | .read_iter = blkdev_read_iter, |
1665 | .write_iter = blkdev_write_iter, | 1663 | .write_iter = blkdev_write_iter, |
1666 | .mmap = generic_file_mmap, | 1664 | .mmap = generic_file_mmap, |
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index aee18f84e315..cdc801c85105 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
@@ -2806,8 +2806,6 @@ out: | |||
2806 | 2806 | ||
2807 | const struct file_operations btrfs_file_operations = { | 2807 | const struct file_operations btrfs_file_operations = { |
2808 | .llseek = btrfs_file_llseek, | 2808 | .llseek = btrfs_file_llseek, |
2809 | .read = new_sync_read, | ||
2810 | .write = new_sync_write, | ||
2811 | .read_iter = generic_file_read_iter, | 2809 | .read_iter = generic_file_read_iter, |
2812 | .splice_read = generic_file_splice_read, | 2810 | .splice_read = generic_file_splice_read, |
2813 | .write_iter = btrfs_file_write_iter, | 2811 | .write_iter = btrfs_file_write_iter, |
diff --git a/fs/ceph/file.c b/fs/ceph/file.c index 139f2fea91a0..56237ea5fc22 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c | |||
@@ -1331,8 +1331,6 @@ const struct file_operations ceph_file_fops = { | |||
1331 | .open = ceph_open, | 1331 | .open = ceph_open, |
1332 | .release = ceph_release, | 1332 | .release = ceph_release, |
1333 | .llseek = ceph_llseek, | 1333 | .llseek = ceph_llseek, |
1334 | .read = new_sync_read, | ||
1335 | .write = new_sync_write, | ||
1336 | .read_iter = ceph_read_iter, | 1334 | .read_iter = ceph_read_iter, |
1337 | .write_iter = ceph_write_iter, | 1335 | .write_iter = ceph_write_iter, |
1338 | .mmap = ceph_mmap, | 1336 | .mmap = ceph_mmap, |
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index d72fe37f5420..eaab4b2a0595 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c | |||
@@ -906,8 +906,6 @@ const struct inode_operations cifs_symlink_inode_ops = { | |||
906 | }; | 906 | }; |
907 | 907 | ||
908 | const struct file_operations cifs_file_ops = { | 908 | const struct file_operations cifs_file_ops = { |
909 | .read = new_sync_read, | ||
910 | .write = new_sync_write, | ||
911 | .read_iter = cifs_loose_read_iter, | 909 | .read_iter = cifs_loose_read_iter, |
912 | .write_iter = cifs_file_write_iter, | 910 | .write_iter = cifs_file_write_iter, |
913 | .open = cifs_open, | 911 | .open = cifs_open, |
@@ -926,8 +924,6 @@ const struct file_operations cifs_file_ops = { | |||
926 | }; | 924 | }; |
927 | 925 | ||
928 | const struct file_operations cifs_file_strict_ops = { | 926 | const struct file_operations cifs_file_strict_ops = { |
929 | .read = new_sync_read, | ||
930 | .write = new_sync_write, | ||
931 | .read_iter = cifs_strict_readv, | 927 | .read_iter = cifs_strict_readv, |
932 | .write_iter = cifs_strict_writev, | 928 | .write_iter = cifs_strict_writev, |
933 | .open = cifs_open, | 929 | .open = cifs_open, |
@@ -947,8 +943,6 @@ const struct file_operations cifs_file_strict_ops = { | |||
947 | 943 | ||
948 | const struct file_operations cifs_file_direct_ops = { | 944 | const struct file_operations cifs_file_direct_ops = { |
949 | /* BB reevaluate whether they can be done with directio, no cache */ | 945 | /* BB reevaluate whether they can be done with directio, no cache */ |
950 | .read = new_sync_read, | ||
951 | .write = new_sync_write, | ||
952 | .read_iter = cifs_user_readv, | 946 | .read_iter = cifs_user_readv, |
953 | .write_iter = cifs_user_writev, | 947 | .write_iter = cifs_user_writev, |
954 | .open = cifs_open, | 948 | .open = cifs_open, |
@@ -967,8 +961,6 @@ const struct file_operations cifs_file_direct_ops = { | |||
967 | }; | 961 | }; |
968 | 962 | ||
969 | const struct file_operations cifs_file_nobrl_ops = { | 963 | const struct file_operations cifs_file_nobrl_ops = { |
970 | .read = new_sync_read, | ||
971 | .write = new_sync_write, | ||
972 | .read_iter = cifs_loose_read_iter, | 964 | .read_iter = cifs_loose_read_iter, |
973 | .write_iter = cifs_file_write_iter, | 965 | .write_iter = cifs_file_write_iter, |
974 | .open = cifs_open, | 966 | .open = cifs_open, |
@@ -986,8 +978,6 @@ const struct file_operations cifs_file_nobrl_ops = { | |||
986 | }; | 978 | }; |
987 | 979 | ||
988 | const struct file_operations cifs_file_strict_nobrl_ops = { | 980 | const struct file_operations cifs_file_strict_nobrl_ops = { |
989 | .read = new_sync_read, | ||
990 | .write = new_sync_write, | ||
991 | .read_iter = cifs_strict_readv, | 981 | .read_iter = cifs_strict_readv, |
992 | .write_iter = cifs_strict_writev, | 982 | .write_iter = cifs_strict_writev, |
993 | .open = cifs_open, | 983 | .open = cifs_open, |
@@ -1006,8 +996,6 @@ const struct file_operations cifs_file_strict_nobrl_ops = { | |||
1006 | 996 | ||
1007 | const struct file_operations cifs_file_direct_nobrl_ops = { | 997 | const struct file_operations cifs_file_direct_nobrl_ops = { |
1008 | /* BB reevaluate whether they can be done with directio, no cache */ | 998 | /* BB reevaluate whether they can be done with directio, no cache */ |
1009 | .read = new_sync_read, | ||
1010 | .write = new_sync_write, | ||
1011 | .read_iter = cifs_user_readv, | 999 | .read_iter = cifs_user_readv, |
1012 | .write_iter = cifs_user_writev, | 1000 | .write_iter = cifs_user_writev, |
1013 | .open = cifs_open, | 1001 | .open = cifs_open, |
diff --git a/fs/coda/file.c b/fs/coda/file.c index d244d743a232..1da3805f3ddc 100644 --- a/fs/coda/file.c +++ b/fs/coda/file.c | |||
@@ -27,19 +27,14 @@ | |||
27 | #include "coda_int.h" | 27 | #include "coda_int.h" |
28 | 28 | ||
29 | static ssize_t | 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; | 32 | struct file *coda_file = iocb->ki_filp; |
33 | struct file *host_file; | 33 | struct coda_file_info *cfi = CODA_FTOC(coda_file); |
34 | 34 | ||
35 | cfi = CODA_FTOC(coda_file); | ||
36 | BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); | 35 | BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); |
37 | host_file = cfi->cfi_container; | ||
38 | 36 | ||
39 | if (!host_file->f_op->read) | 37 | return vfs_iter_read(cfi->cfi_container, to, &iocb->ki_pos); |
40 | return -EINVAL; | ||
41 | |||
42 | return host_file->f_op->read(host_file, buf, count, ppos); | ||
43 | } | 38 | } |
44 | 39 | ||
45 | static ssize_t | 40 | static ssize_t |
@@ -64,32 +59,25 @@ coda_file_splice_read(struct file *coda_file, loff_t *ppos, | |||
64 | } | 59 | } |
65 | 60 | ||
66 | static ssize_t | 61 | static ssize_t |
67 | coda_file_write(struct file *coda_file, const char __user *buf, size_t count, loff_t *ppos) | 62 | coda_file_write_iter(struct kiocb *iocb, struct iov_iter *to) |
68 | { | 63 | { |
69 | struct inode *host_inode, *coda_inode = file_inode(coda_file); | 64 | struct file *coda_file = iocb->ki_filp; |
70 | struct coda_file_info *cfi; | 65 | struct inode *coda_inode = file_inode(coda_file); |
66 | struct coda_file_info *cfi = CODA_FTOC(coda_file); | ||
71 | struct file *host_file; | 67 | struct file *host_file; |
72 | ssize_t ret; | 68 | ssize_t ret; |
73 | 69 | ||
74 | cfi = CODA_FTOC(coda_file); | ||
75 | BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); | 70 | BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); |
76 | host_file = cfi->cfi_container; | ||
77 | |||
78 | if (!host_file->f_op->write) | ||
79 | return -EINVAL; | ||
80 | 71 | ||
81 | host_inode = file_inode(host_file); | 72 | host_file = cfi->cfi_container; |
82 | file_start_write(host_file); | 73 | file_start_write(host_file); |
83 | mutex_lock(&coda_inode->i_mutex); | 74 | mutex_lock(&coda_inode->i_mutex); |
84 | 75 | ret = vfs_iter_write(cfi->cfi_container, to, &iocb->ki_pos); | |
85 | ret = host_file->f_op->write(host_file, buf, count, ppos); | 76 | coda_inode->i_size = file_inode(host_file)->i_size; |
86 | |||
87 | coda_inode->i_size = host_inode->i_size; | ||
88 | coda_inode->i_blocks = (coda_inode->i_size + 511) >> 9; | 77 | coda_inode->i_blocks = (coda_inode->i_size + 511) >> 9; |
89 | coda_inode->i_mtime = coda_inode->i_ctime = CURRENT_TIME_SEC; | 78 | coda_inode->i_mtime = coda_inode->i_ctime = CURRENT_TIME_SEC; |
90 | mutex_unlock(&coda_inode->i_mutex); | 79 | mutex_unlock(&coda_inode->i_mutex); |
91 | file_end_write(host_file); | 80 | file_end_write(host_file); |
92 | |||
93 | return ret; | 81 | return ret; |
94 | } | 82 | } |
95 | 83 | ||
@@ -231,8 +219,8 @@ int coda_fsync(struct file *coda_file, loff_t start, loff_t end, int datasync) | |||
231 | 219 | ||
232 | const struct file_operations coda_file_operations = { | 220 | const struct file_operations coda_file_operations = { |
233 | .llseek = generic_file_llseek, | 221 | .llseek = generic_file_llseek, |
234 | .read = coda_file_read, | 222 | .read_iter = coda_file_read_iter, |
235 | .write = coda_file_write, | 223 | .write_iter = coda_file_write_iter, |
236 | .mmap = coda_file_mmap, | 224 | .mmap = coda_file_mmap, |
237 | .open = coda_open, | 225 | .open = coda_open, |
238 | .release = coda_release, | 226 | .release = coda_release, |
diff --git a/fs/coredump.c b/fs/coredump.c index f319926ddf8c..bbbe139ab280 100644 --- a/fs/coredump.c +++ b/fs/coredump.c | |||
@@ -657,7 +657,7 @@ void do_coredump(const siginfo_t *siginfo) | |||
657 | */ | 657 | */ |
658 | if (!uid_eq(inode->i_uid, current_fsuid())) | 658 | if (!uid_eq(inode->i_uid, current_fsuid())) |
659 | goto close_fail; | 659 | goto close_fail; |
660 | if (!cprm.file->f_op->write) | 660 | if (!(cprm.file->f_mode & FMODE_CAN_WRITE)) |
661 | goto close_fail; | 661 | goto close_fail; |
662 | if (do_truncate(cprm.file->f_path.dentry, 0, 0, cprm.file)) | 662 | if (do_truncate(cprm.file->f_path.dentry, 0, 0, cprm.file)) |
663 | goto close_fail; | 663 | goto close_fail; |
diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c index 79675089443d..a65786e26b05 100644 --- a/fs/ecryptfs/file.c +++ b/fs/ecryptfs/file.c | |||
@@ -358,9 +358,7 @@ const struct file_operations ecryptfs_dir_fops = { | |||
358 | 358 | ||
359 | const struct file_operations ecryptfs_main_fops = { | 359 | const struct file_operations ecryptfs_main_fops = { |
360 | .llseek = generic_file_llseek, | 360 | .llseek = generic_file_llseek, |
361 | .read = new_sync_read, | ||
362 | .read_iter = ecryptfs_read_update_atime, | 361 | .read_iter = ecryptfs_read_update_atime, |
363 | .write = new_sync_write, | ||
364 | .write_iter = generic_file_write_iter, | 362 | .write_iter = generic_file_write_iter, |
365 | .iterate = ecryptfs_readdir, | 363 | .iterate = ecryptfs_readdir, |
366 | .unlocked_ioctl = ecryptfs_unlocked_ioctl, | 364 | .unlocked_ioctl = ecryptfs_unlocked_ioctl, |
diff --git a/fs/exofs/file.c b/fs/exofs/file.c index 1a376b42d305..906de66e8e7e 100644 --- a/fs/exofs/file.c +++ b/fs/exofs/file.c | |||
@@ -67,8 +67,6 @@ static int exofs_flush(struct file *file, fl_owner_t id) | |||
67 | 67 | ||
68 | const struct file_operations exofs_file_operations = { | 68 | const struct file_operations exofs_file_operations = { |
69 | .llseek = generic_file_llseek, | 69 | .llseek = generic_file_llseek, |
70 | .read = new_sync_read, | ||
71 | .write = new_sync_write, | ||
72 | .read_iter = generic_file_read_iter, | 70 | .read_iter = generic_file_read_iter, |
73 | .write_iter = generic_file_write_iter, | 71 | .write_iter = generic_file_write_iter, |
74 | .mmap = generic_file_mmap, | 72 | .mmap = generic_file_mmap, |
diff --git a/fs/ext2/file.c b/fs/ext2/file.c index e31701713516..ef04fdb57dbf 100644 --- a/fs/ext2/file.c +++ b/fs/ext2/file.c | |||
@@ -92,8 +92,6 @@ int ext2_fsync(struct file *file, loff_t start, loff_t end, int datasync) | |||
92 | */ | 92 | */ |
93 | const struct file_operations ext2_file_operations = { | 93 | const struct file_operations ext2_file_operations = { |
94 | .llseek = generic_file_llseek, | 94 | .llseek = generic_file_llseek, |
95 | .read = new_sync_read, | ||
96 | .write = new_sync_write, | ||
97 | .read_iter = generic_file_read_iter, | 95 | .read_iter = generic_file_read_iter, |
98 | .write_iter = generic_file_write_iter, | 96 | .write_iter = generic_file_write_iter, |
99 | .unlocked_ioctl = ext2_ioctl, | 97 | .unlocked_ioctl = ext2_ioctl, |
@@ -111,8 +109,6 @@ const struct file_operations ext2_file_operations = { | |||
111 | #ifdef CONFIG_FS_DAX | 109 | #ifdef CONFIG_FS_DAX |
112 | const struct file_operations ext2_dax_file_operations = { | 110 | const struct file_operations ext2_dax_file_operations = { |
113 | .llseek = generic_file_llseek, | 111 | .llseek = generic_file_llseek, |
114 | .read = new_sync_read, | ||
115 | .write = new_sync_write, | ||
116 | .read_iter = generic_file_read_iter, | 112 | .read_iter = generic_file_read_iter, |
117 | .write_iter = generic_file_write_iter, | 113 | .write_iter = generic_file_write_iter, |
118 | .unlocked_ioctl = ext2_ioctl, | 114 | .unlocked_ioctl = ext2_ioctl, |
diff --git a/fs/ext3/file.c b/fs/ext3/file.c index a062fa1e1b11..3b8f650de22c 100644 --- a/fs/ext3/file.c +++ b/fs/ext3/file.c | |||
@@ -50,8 +50,6 @@ static int ext3_release_file (struct inode * inode, struct file * filp) | |||
50 | 50 | ||
51 | const struct file_operations ext3_file_operations = { | 51 | const struct file_operations ext3_file_operations = { |
52 | .llseek = generic_file_llseek, | 52 | .llseek = generic_file_llseek, |
53 | .read = new_sync_read, | ||
54 | .write = new_sync_write, | ||
55 | .read_iter = generic_file_read_iter, | 53 | .read_iter = generic_file_read_iter, |
56 | .write_iter = generic_file_write_iter, | 54 | .write_iter = generic_file_write_iter, |
57 | .unlocked_ioctl = ext3_ioctl, | 55 | .unlocked_ioctl = ext3_ioctl, |
diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 598abbbe6786..9ad03036d9f5 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c | |||
@@ -607,8 +607,6 @@ loff_t ext4_llseek(struct file *file, loff_t offset, int whence) | |||
607 | 607 | ||
608 | const struct file_operations ext4_file_operations = { | 608 | const struct file_operations ext4_file_operations = { |
609 | .llseek = ext4_llseek, | 609 | .llseek = ext4_llseek, |
610 | .read = new_sync_read, | ||
611 | .write = new_sync_write, | ||
612 | .read_iter = generic_file_read_iter, | 610 | .read_iter = generic_file_read_iter, |
613 | .write_iter = ext4_file_write_iter, | 611 | .write_iter = ext4_file_write_iter, |
614 | .unlocked_ioctl = ext4_ioctl, | 612 | .unlocked_ioctl = ext4_ioctl, |
@@ -627,8 +625,6 @@ const struct file_operations ext4_file_operations = { | |||
627 | #ifdef CONFIG_FS_DAX | 625 | #ifdef CONFIG_FS_DAX |
628 | const struct file_operations ext4_dax_file_operations = { | 626 | const struct file_operations ext4_dax_file_operations = { |
629 | .llseek = ext4_llseek, | 627 | .llseek = ext4_llseek, |
630 | .read = new_sync_read, | ||
631 | .write = new_sync_write, | ||
632 | .read_iter = generic_file_read_iter, | 628 | .read_iter = generic_file_read_iter, |
633 | .write_iter = ext4_file_write_iter, | 629 | .write_iter = ext4_file_write_iter, |
634 | .unlocked_ioctl = ext4_ioctl, | 630 | .unlocked_ioctl = ext4_ioctl, |
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 98dac27bc3f7..df6a0596eccf 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c | |||
@@ -1104,8 +1104,6 @@ long f2fs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
1104 | 1104 | ||
1105 | const struct file_operations f2fs_file_operations = { | 1105 | const struct file_operations f2fs_file_operations = { |
1106 | .llseek = f2fs_llseek, | 1106 | .llseek = f2fs_llseek, |
1107 | .read = new_sync_read, | ||
1108 | .write = new_sync_write, | ||
1109 | .read_iter = generic_file_read_iter, | 1107 | .read_iter = generic_file_read_iter, |
1110 | .write_iter = generic_file_write_iter, | 1108 | .write_iter = generic_file_write_iter, |
1111 | .open = generic_file_open, | 1109 | .open = generic_file_open, |
diff --git a/fs/fat/file.c b/fs/fat/file.c index 8429c68e3057..1e98d333879f 100644 --- a/fs/fat/file.c +++ b/fs/fat/file.c | |||
@@ -170,8 +170,6 @@ int fat_file_fsync(struct file *filp, loff_t start, loff_t end, int datasync) | |||
170 | 170 | ||
171 | const struct file_operations fat_file_operations = { | 171 | const struct file_operations fat_file_operations = { |
172 | .llseek = generic_file_llseek, | 172 | .llseek = generic_file_llseek, |
173 | .read = new_sync_read, | ||
174 | .write = new_sync_write, | ||
175 | .read_iter = generic_file_read_iter, | 173 | .read_iter = generic_file_read_iter, |
176 | .write_iter = generic_file_write_iter, | 174 | .write_iter = generic_file_write_iter, |
177 | .mmap = generic_file_mmap, | 175 | .mmap = generic_file_mmap, |
diff --git a/fs/file_table.c b/fs/file_table.c index 3f85411b03ce..294174dcc226 100644 --- a/fs/file_table.c +++ b/fs/file_table.c | |||
@@ -168,10 +168,10 @@ struct file *alloc_file(struct path *path, fmode_t mode, | |||
168 | file->f_inode = path->dentry->d_inode; | 168 | file->f_inode = path->dentry->d_inode; |
169 | file->f_mapping = path->dentry->d_inode->i_mapping; | 169 | file->f_mapping = path->dentry->d_inode->i_mapping; |
170 | if ((mode & FMODE_READ) && | 170 | if ((mode & FMODE_READ) && |
171 | likely(fop->read || fop->aio_read || fop->read_iter)) | 171 | likely(fop->read || fop->read_iter)) |
172 | mode |= FMODE_CAN_READ; | 172 | mode |= FMODE_CAN_READ; |
173 | if ((mode & FMODE_WRITE) && | 173 | if ((mode & FMODE_WRITE) && |
174 | likely(fop->write || fop->aio_write || fop->write_iter)) | 174 | likely(fop->write || fop->write_iter)) |
175 | mode |= FMODE_CAN_WRITE; | 175 | mode |= FMODE_CAN_WRITE; |
176 | file->f_mode = mode; | 176 | file->f_mode = mode; |
177 | file->f_op = fop; | 177 | file->f_op = fop; |
diff --git a/fs/fuse/cuse.c b/fs/fuse/cuse.c index b3fa05032234..e5bbf748b698 100644 --- a/fs/fuse/cuse.c +++ b/fs/fuse/cuse.c | |||
@@ -88,32 +88,23 @@ static struct list_head *cuse_conntbl_head(dev_t devt) | |||
88 | * FUSE file. | 88 | * FUSE file. |
89 | */ | 89 | */ |
90 | 90 | ||
91 | static ssize_t cuse_read(struct file *file, char __user *buf, size_t count, | 91 | static ssize_t cuse_read_iter(struct kiocb *kiocb, struct iov_iter *to) |
92 | loff_t *ppos) | ||
93 | { | 92 | { |
93 | struct fuse_io_priv io = { .async = 0, .file = kiocb->ki_filp }; | ||
94 | loff_t pos = 0; | 94 | loff_t pos = 0; |
95 | struct iovec iov = { .iov_base = buf, .iov_len = count }; | ||
96 | struct fuse_io_priv io = { .async = 0, .file = file }; | ||
97 | struct iov_iter ii; | ||
98 | iov_iter_init(&ii, READ, &iov, 1, count); | ||
99 | 95 | ||
100 | return fuse_direct_io(&io, &ii, &pos, FUSE_DIO_CUSE); | 96 | return fuse_direct_io(&io, to, &pos, FUSE_DIO_CUSE); |
101 | } | 97 | } |
102 | 98 | ||
103 | static ssize_t cuse_write(struct file *file, const char __user *buf, | 99 | static ssize_t cuse_write_iter(struct kiocb *kiocb, struct iov_iter *from) |
104 | size_t count, loff_t *ppos) | ||
105 | { | 100 | { |
101 | struct fuse_io_priv io = { .async = 0, .file = kiocb->ki_filp }; | ||
106 | loff_t pos = 0; | 102 | loff_t pos = 0; |
107 | struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = count }; | ||
108 | struct fuse_io_priv io = { .async = 0, .file = file }; | ||
109 | struct iov_iter ii; | ||
110 | iov_iter_init(&ii, WRITE, &iov, 1, count); | ||
111 | |||
112 | /* | 103 | /* |
113 | * No locking or generic_write_checks(), the server is | 104 | * No locking or generic_write_checks(), the server is |
114 | * responsible for locking and sanity checks. | 105 | * responsible for locking and sanity checks. |
115 | */ | 106 | */ |
116 | return fuse_direct_io(&io, &ii, &pos, | 107 | return fuse_direct_io(&io, from, &pos, |
117 | FUSE_DIO_WRITE | FUSE_DIO_CUSE); | 108 | FUSE_DIO_WRITE | FUSE_DIO_CUSE); |
118 | } | 109 | } |
119 | 110 | ||
@@ -186,8 +177,8 @@ static long cuse_file_compat_ioctl(struct file *file, unsigned int cmd, | |||
186 | 177 | ||
187 | static const struct file_operations cuse_frontend_fops = { | 178 | static const struct file_operations cuse_frontend_fops = { |
188 | .owner = THIS_MODULE, | 179 | .owner = THIS_MODULE, |
189 | .read = cuse_read, | 180 | .read_iter = cuse_read_iter, |
190 | .write = cuse_write, | 181 | .write_iter = cuse_write_iter, |
191 | .open = cuse_open, | 182 | .open = cuse_open, |
192 | .release = cuse_release, | 183 | .release = cuse_release, |
193 | .unlocked_ioctl = cuse_file_ioctl, | 184 | .unlocked_ioctl = cuse_file_ioctl, |
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c index 95a2797eef66..c8b68ab2e574 100644 --- a/fs/fuse/dev.c +++ b/fs/fuse/dev.c | |||
@@ -710,28 +710,26 @@ struct fuse_copy_state { | |||
710 | struct fuse_conn *fc; | 710 | struct fuse_conn *fc; |
711 | int write; | 711 | int write; |
712 | struct fuse_req *req; | 712 | struct fuse_req *req; |
713 | const struct iovec *iov; | 713 | struct iov_iter *iter; |
714 | struct pipe_buffer *pipebufs; | 714 | struct pipe_buffer *pipebufs; |
715 | struct pipe_buffer *currbuf; | 715 | struct pipe_buffer *currbuf; |
716 | struct pipe_inode_info *pipe; | 716 | struct pipe_inode_info *pipe; |
717 | unsigned long nr_segs; | 717 | unsigned long nr_segs; |
718 | unsigned long seglen; | ||
719 | unsigned long addr; | ||
720 | struct page *pg; | 718 | struct page *pg; |
721 | unsigned len; | 719 | unsigned len; |
722 | unsigned offset; | 720 | unsigned offset; |
723 | unsigned move_pages:1; | 721 | unsigned move_pages:1; |
724 | }; | 722 | }; |
725 | 723 | ||
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 | int write, | 726 | int write, |
728 | const struct iovec *iov, unsigned long nr_segs) | 727 | struct iov_iter *iter) |
729 | { | 728 | { |
730 | memset(cs, 0, sizeof(*cs)); | 729 | memset(cs, 0, sizeof(*cs)); |
731 | cs->fc = fc; | 730 | cs->fc = fc; |
732 | cs->write = write; | 731 | cs->write = write; |
733 | cs->iov = iov; | 732 | cs->iter = iter; |
734 | cs->nr_segs = nr_segs; | ||
735 | } | 733 | } |
736 | 734 | ||
737 | /* Unmap and put previous page of userspace buffer */ | 735 | /* Unmap and put previous page of userspace buffer */ |
@@ -799,22 +797,16 @@ static int fuse_copy_fill(struct fuse_copy_state *cs) | |||
799 | cs->nr_segs++; | 797 | cs->nr_segs++; |
800 | } | 798 | } |
801 | } else { | 799 | } else { |
802 | if (!cs->seglen) { | 800 | size_t off; |
803 | BUG_ON(!cs->nr_segs); | 801 | err = iov_iter_get_pages(cs->iter, &page, PAGE_SIZE, 1, &off); |
804 | cs->seglen = cs->iov[0].iov_len; | ||
805 | cs->addr = (unsigned long) cs->iov[0].iov_base; | ||
806 | cs->iov++; | ||
807 | cs->nr_segs--; | ||
808 | } | ||
809 | err = get_user_pages_fast(cs->addr, 1, cs->write, &page); | ||
810 | if (err < 0) | 802 | if (err < 0) |
811 | return err; | 803 | return err; |
812 | BUG_ON(err != 1); | 804 | BUG_ON(!err); |
805 | cs->len = err; | ||
806 | cs->offset = off; | ||
813 | cs->pg = page; | 807 | cs->pg = page; |
814 | cs->offset = cs->addr % PAGE_SIZE; | 808 | cs->offset = off; |
815 | cs->len = min(PAGE_SIZE - cs->offset, cs->seglen); | 809 | iov_iter_advance(cs->iter, err); |
816 | cs->seglen -= cs->len; | ||
817 | cs->addr += cs->len; | ||
818 | } | 810 | } |
819 | 811 | ||
820 | return lock_request(cs->fc, cs->req); | 812 | return lock_request(cs->fc, cs->req); |
@@ -1363,8 +1355,7 @@ static int fuse_dev_open(struct inode *inode, struct file *file) | |||
1363 | return 0; | 1355 | return 0; |
1364 | } | 1356 | } |
1365 | 1357 | ||
1366 | static ssize_t fuse_dev_read(struct kiocb *iocb, const struct iovec *iov, | 1358 | static ssize_t fuse_dev_read(struct kiocb *iocb, struct iov_iter *to) |
1367 | unsigned long nr_segs, loff_t pos) | ||
1368 | { | 1359 | { |
1369 | struct fuse_copy_state cs; | 1360 | struct fuse_copy_state cs; |
1370 | struct file *file = iocb->ki_filp; | 1361 | struct file *file = iocb->ki_filp; |
@@ -1372,9 +1363,12 @@ static ssize_t fuse_dev_read(struct kiocb *iocb, const struct iovec *iov, | |||
1372 | if (!fc) | 1363 | if (!fc) |
1373 | return -EPERM; | 1364 | return -EPERM; |
1374 | 1365 | ||
1375 | fuse_copy_init(&cs, fc, 1, iov, nr_segs); | 1366 | if (!iter_is_iovec(to)) |
1367 | return -EINVAL; | ||
1376 | 1368 | ||
1377 | return fuse_dev_do_read(fc, file, &cs, iov_length(iov, nr_segs)); | 1369 | fuse_copy_init(&cs, fc, 1, to); |
1370 | |||
1371 | return fuse_dev_do_read(fc, file, &cs, iov_iter_count(to)); | ||
1378 | } | 1372 | } |
1379 | 1373 | ||
1380 | static ssize_t fuse_dev_splice_read(struct file *in, loff_t *ppos, | 1374 | static ssize_t fuse_dev_splice_read(struct file *in, loff_t *ppos, |
@@ -1394,7 +1388,7 @@ static ssize_t fuse_dev_splice_read(struct file *in, loff_t *ppos, | |||
1394 | if (!bufs) | 1388 | if (!bufs) |
1395 | return -ENOMEM; | 1389 | return -ENOMEM; |
1396 | 1390 | ||
1397 | fuse_copy_init(&cs, fc, 1, NULL, 0); | 1391 | fuse_copy_init(&cs, fc, 1, NULL); |
1398 | cs.pipebufs = bufs; | 1392 | cs.pipebufs = bufs; |
1399 | cs.pipe = pipe; | 1393 | cs.pipe = pipe; |
1400 | ret = fuse_dev_do_read(fc, in, &cs, len); | 1394 | ret = fuse_dev_do_read(fc, in, &cs, len); |
@@ -1970,17 +1964,19 @@ static ssize_t fuse_dev_do_write(struct fuse_conn *fc, | |||
1970 | return err; | 1964 | return err; |
1971 | } | 1965 | } |
1972 | 1966 | ||
1973 | static ssize_t fuse_dev_write(struct kiocb *iocb, const struct iovec *iov, | 1967 | static ssize_t fuse_dev_write(struct kiocb *iocb, struct iov_iter *from) |
1974 | unsigned long nr_segs, loff_t pos) | ||
1975 | { | 1968 | { |
1976 | struct fuse_copy_state cs; | 1969 | struct fuse_copy_state cs; |
1977 | struct fuse_conn *fc = fuse_get_conn(iocb->ki_filp); | 1970 | struct fuse_conn *fc = fuse_get_conn(iocb->ki_filp); |
1978 | if (!fc) | 1971 | if (!fc) |
1979 | return -EPERM; | 1972 | return -EPERM; |
1980 | 1973 | ||
1981 | fuse_copy_init(&cs, fc, 0, iov, nr_segs); | 1974 | if (!iter_is_iovec(from)) |
1975 | return -EINVAL; | ||
1976 | |||
1977 | fuse_copy_init(&cs, fc, 0, from); | ||
1982 | 1978 | ||
1983 | return fuse_dev_do_write(fc, &cs, iov_length(iov, nr_segs)); | 1979 | return fuse_dev_do_write(fc, &cs, iov_iter_count(from)); |
1984 | } | 1980 | } |
1985 | 1981 | ||
1986 | static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe, | 1982 | static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe, |
@@ -2043,8 +2039,9 @@ static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe, | |||
2043 | } | 2039 | } |
2044 | pipe_unlock(pipe); | 2040 | pipe_unlock(pipe); |
2045 | 2041 | ||
2046 | fuse_copy_init(&cs, fc, 0, NULL, nbuf); | 2042 | fuse_copy_init(&cs, fc, 0, NULL); |
2047 | cs.pipebufs = bufs; | 2043 | cs.pipebufs = bufs; |
2044 | cs.nr_segs = nbuf; | ||
2048 | cs.pipe = pipe; | 2045 | cs.pipe = pipe; |
2049 | 2046 | ||
2050 | if (flags & SPLICE_F_MOVE) | 2047 | if (flags & SPLICE_F_MOVE) |
@@ -2232,11 +2229,9 @@ const struct file_operations fuse_dev_operations = { | |||
2232 | .owner = THIS_MODULE, | 2229 | .owner = THIS_MODULE, |
2233 | .open = fuse_dev_open, | 2230 | .open = fuse_dev_open, |
2234 | .llseek = no_llseek, | 2231 | .llseek = no_llseek, |
2235 | .read = do_sync_read, | 2232 | .read_iter = fuse_dev_read, |
2236 | .aio_read = fuse_dev_read, | ||
2237 | .splice_read = fuse_dev_splice_read, | 2233 | .splice_read = fuse_dev_splice_read, |
2238 | .write = do_sync_write, | 2234 | .write_iter = fuse_dev_write, |
2239 | .aio_write = fuse_dev_write, | ||
2240 | .splice_write = fuse_dev_splice_write, | 2235 | .splice_write = fuse_dev_splice_write, |
2241 | .poll = fuse_dev_poll, | 2236 | .poll = fuse_dev_poll, |
2242 | .release = fuse_dev_release, | 2237 | .release = fuse_dev_release, |
diff --git a/fs/fuse/file.c b/fs/fuse/file.c index ff102cbf16ea..e1afdd7abf90 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c | |||
@@ -1401,55 +1401,33 @@ static ssize_t __fuse_direct_read(struct fuse_io_priv *io, | |||
1401 | return res; | 1401 | return res; |
1402 | } | 1402 | } |
1403 | 1403 | ||
1404 | static ssize_t fuse_direct_read(struct file *file, char __user *buf, | 1404 | static ssize_t fuse_direct_read_iter(struct kiocb *iocb, struct iov_iter *to) |
1405 | size_t count, loff_t *ppos) | ||
1406 | { | 1405 | { |
1407 | struct fuse_io_priv io = { .async = 0, .file = file }; | 1406 | struct fuse_io_priv io = { .async = 0, .file = iocb->ki_filp }; |
1408 | struct iovec iov = { .iov_base = buf, .iov_len = count }; | 1407 | return __fuse_direct_read(&io, to, &iocb->ki_pos); |
1409 | struct iov_iter ii; | ||
1410 | iov_iter_init(&ii, READ, &iov, 1, count); | ||
1411 | return __fuse_direct_read(&io, &ii, ppos); | ||
1412 | } | 1408 | } |
1413 | 1409 | ||
1414 | static ssize_t __fuse_direct_write(struct fuse_io_priv *io, | 1410 | static ssize_t fuse_direct_write_iter(struct kiocb *iocb, struct iov_iter *from) |
1415 | struct iov_iter *iter, | ||
1416 | loff_t *ppos) | ||
1417 | { | 1411 | { |
1418 | struct file *file = io->file; | 1412 | struct file *file = iocb->ki_filp; |
1419 | struct inode *inode = file_inode(file); | ||
1420 | size_t count = iov_iter_count(iter); | ||
1421 | ssize_t res; | ||
1422 | |||
1423 | |||
1424 | res = generic_write_checks(file, ppos, &count, 0); | ||
1425 | if (!res) { | ||
1426 | iov_iter_truncate(iter, count); | ||
1427 | res = fuse_direct_io(io, iter, ppos, FUSE_DIO_WRITE); | ||
1428 | } | ||
1429 | |||
1430 | fuse_invalidate_attr(inode); | ||
1431 | |||
1432 | return res; | ||
1433 | } | ||
1434 | |||
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); | 1413 | struct inode *inode = file_inode(file); |
1440 | ssize_t res; | ||
1441 | struct fuse_io_priv io = { .async = 0, .file = file }; | 1414 | struct fuse_io_priv io = { .async = 0, .file = file }; |
1442 | struct iov_iter ii; | 1415 | size_t count = iov_iter_count(from); |
1443 | iov_iter_init(&ii, WRITE, &iov, 1, count); | 1416 | ssize_t res; |
1444 | 1417 | ||
1445 | if (is_bad_inode(inode)) | 1418 | if (is_bad_inode(inode)) |
1446 | return -EIO; | 1419 | return -EIO; |
1447 | 1420 | ||
1448 | /* Don't allow parallel writes to the same file */ | 1421 | /* Don't allow parallel writes to the same file */ |
1449 | mutex_lock(&inode->i_mutex); | 1422 | mutex_lock(&inode->i_mutex); |
1450 | res = __fuse_direct_write(&io, &ii, ppos); | 1423 | res = generic_write_checks(file, &iocb->ki_pos, &count, 0); |
1424 | if (!res) { | ||
1425 | iov_iter_truncate(from, count); | ||
1426 | res = fuse_direct_io(&io, from, &iocb->ki_pos, FUSE_DIO_WRITE); | ||
1427 | } | ||
1428 | fuse_invalidate_attr(inode); | ||
1451 | if (res > 0) | 1429 | if (res > 0) |
1452 | fuse_write_update_size(inode, *ppos); | 1430 | fuse_write_update_size(inode, iocb->ki_pos); |
1453 | mutex_unlock(&inode->i_mutex); | 1431 | mutex_unlock(&inode->i_mutex); |
1454 | 1432 | ||
1455 | return res; | 1433 | return res; |
@@ -2862,10 +2840,17 @@ fuse_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter, | |||
2862 | if (io->async && is_sync_kiocb(iocb)) | 2840 | if (io->async && is_sync_kiocb(iocb)) |
2863 | io->done = &wait; | 2841 | io->done = &wait; |
2864 | 2842 | ||
2865 | if (rw == WRITE) | 2843 | if (rw == WRITE) { |
2866 | ret = __fuse_direct_write(io, iter, &pos); | 2844 | ret = generic_write_checks(file, &pos, &count, 0); |
2867 | else | 2845 | if (!ret) { |
2846 | iov_iter_truncate(iter, count); | ||
2847 | ret = fuse_direct_io(io, iter, &pos, FUSE_DIO_WRITE); | ||
2848 | } | ||
2849 | |||
2850 | fuse_invalidate_attr(inode); | ||
2851 | } else { | ||
2868 | ret = __fuse_direct_read(io, iter, &pos); | 2852 | ret = __fuse_direct_read(io, iter, &pos); |
2853 | } | ||
2869 | 2854 | ||
2870 | if (io->async) { | 2855 | if (io->async) { |
2871 | fuse_aio_complete(io, ret < 0 ? ret : 0, -1); | 2856 | fuse_aio_complete(io, ret < 0 ? ret : 0, -1); |
@@ -2968,9 +2953,7 @@ out: | |||
2968 | 2953 | ||
2969 | static const struct file_operations fuse_file_operations = { | 2954 | static const struct file_operations fuse_file_operations = { |
2970 | .llseek = fuse_file_llseek, | 2955 | .llseek = fuse_file_llseek, |
2971 | .read = new_sync_read, | ||
2972 | .read_iter = fuse_file_read_iter, | 2956 | .read_iter = fuse_file_read_iter, |
2973 | .write = new_sync_write, | ||
2974 | .write_iter = fuse_file_write_iter, | 2957 | .write_iter = fuse_file_write_iter, |
2975 | .mmap = fuse_file_mmap, | 2958 | .mmap = fuse_file_mmap, |
2976 | .open = fuse_open, | 2959 | .open = fuse_open, |
@@ -2988,8 +2971,8 @@ static const struct file_operations fuse_file_operations = { | |||
2988 | 2971 | ||
2989 | static const struct file_operations fuse_direct_io_file_operations = { | 2972 | static const struct file_operations fuse_direct_io_file_operations = { |
2990 | .llseek = fuse_file_llseek, | 2973 | .llseek = fuse_file_llseek, |
2991 | .read = fuse_direct_read, | 2974 | .read_iter = fuse_direct_read_iter, |
2992 | .write = fuse_direct_write, | 2975 | .write_iter = fuse_direct_write_iter, |
2993 | .mmap = fuse_direct_mmap, | 2976 | .mmap = fuse_direct_mmap, |
2994 | .open = fuse_open, | 2977 | .open = fuse_open, |
2995 | .flush = fuse_flush, | 2978 | .flush = fuse_flush, |
diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c index 8ec43ab5babf..207eb4a8135e 100644 --- a/fs/gfs2/file.c +++ b/fs/gfs2/file.c | |||
@@ -1105,9 +1105,7 @@ static int gfs2_flock(struct file *file, int cmd, struct file_lock *fl) | |||
1105 | 1105 | ||
1106 | const struct file_operations gfs2_file_fops = { | 1106 | const struct file_operations gfs2_file_fops = { |
1107 | .llseek = gfs2_llseek, | 1107 | .llseek = gfs2_llseek, |
1108 | .read = new_sync_read, | ||
1109 | .read_iter = generic_file_read_iter, | 1108 | .read_iter = generic_file_read_iter, |
1110 | .write = new_sync_write, | ||
1111 | .write_iter = gfs2_file_write_iter, | 1109 | .write_iter = gfs2_file_write_iter, |
1112 | .unlocked_ioctl = gfs2_ioctl, | 1110 | .unlocked_ioctl = gfs2_ioctl, |
1113 | .mmap = gfs2_mmap, | 1111 | .mmap = gfs2_mmap, |
@@ -1137,9 +1135,7 @@ const struct file_operations gfs2_dir_fops = { | |||
1137 | 1135 | ||
1138 | const struct file_operations gfs2_file_fops_nolock = { | 1136 | const struct file_operations gfs2_file_fops_nolock = { |
1139 | .llseek = gfs2_llseek, | 1137 | .llseek = gfs2_llseek, |
1140 | .read = new_sync_read, | ||
1141 | .read_iter = generic_file_read_iter, | 1138 | .read_iter = generic_file_read_iter, |
1142 | .write = new_sync_write, | ||
1143 | .write_iter = gfs2_file_write_iter, | 1139 | .write_iter = gfs2_file_write_iter, |
1144 | .unlocked_ioctl = gfs2_ioctl, | 1140 | .unlocked_ioctl = gfs2_ioctl, |
1145 | .mmap = gfs2_mmap, | 1141 | .mmap = gfs2_mmap, |
diff --git a/fs/hfs/inode.c b/fs/hfs/inode.c index 98d4ea45bb70..9337065bcc67 100644 --- a/fs/hfs/inode.c +++ b/fs/hfs/inode.c | |||
@@ -674,9 +674,7 @@ static int hfs_file_fsync(struct file *filp, loff_t start, loff_t end, | |||
674 | 674 | ||
675 | static const struct file_operations hfs_file_operations = { | 675 | static const struct file_operations hfs_file_operations = { |
676 | .llseek = generic_file_llseek, | 676 | .llseek = generic_file_llseek, |
677 | .read = new_sync_read, | ||
678 | .read_iter = generic_file_read_iter, | 677 | .read_iter = generic_file_read_iter, |
679 | .write = new_sync_write, | ||
680 | .write_iter = generic_file_write_iter, | 678 | .write_iter = generic_file_write_iter, |
681 | .mmap = generic_file_mmap, | 679 | .mmap = generic_file_mmap, |
682 | .splice_read = generic_file_splice_read, | 680 | .splice_read = generic_file_splice_read, |
diff --git a/fs/hfsplus/inode.c b/fs/hfsplus/inode.c index f541196d4ee9..5f86cadb0542 100644 --- a/fs/hfsplus/inode.c +++ b/fs/hfsplus/inode.c | |||
@@ -341,9 +341,7 @@ static const struct inode_operations hfsplus_file_inode_operations = { | |||
341 | 341 | ||
342 | static const struct file_operations hfsplus_file_operations = { | 342 | static const struct file_operations hfsplus_file_operations = { |
343 | .llseek = generic_file_llseek, | 343 | .llseek = generic_file_llseek, |
344 | .read = new_sync_read, | ||
345 | .read_iter = generic_file_read_iter, | 344 | .read_iter = generic_file_read_iter, |
346 | .write = new_sync_write, | ||
347 | .write_iter = generic_file_write_iter, | 345 | .write_iter = generic_file_write_iter, |
348 | .mmap = generic_file_mmap, | 346 | .mmap = generic_file_mmap, |
349 | .splice_read = generic_file_splice_read, | 347 | .splice_read = generic_file_splice_read, |
diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c index fd62cae0fdcb..e021188ca110 100644 --- a/fs/hostfs/hostfs_kern.c +++ b/fs/hostfs/hostfs_kern.c | |||
@@ -378,11 +378,9 @@ static int hostfs_fsync(struct file *file, loff_t start, loff_t end, | |||
378 | 378 | ||
379 | static const struct file_operations hostfs_file_fops = { | 379 | static const struct file_operations hostfs_file_fops = { |
380 | .llseek = generic_file_llseek, | 380 | .llseek = generic_file_llseek, |
381 | .read = new_sync_read, | ||
382 | .splice_read = generic_file_splice_read, | 381 | .splice_read = generic_file_splice_read, |
383 | .read_iter = generic_file_read_iter, | 382 | .read_iter = generic_file_read_iter, |
384 | .write_iter = generic_file_write_iter, | 383 | .write_iter = generic_file_write_iter, |
385 | .write = new_sync_write, | ||
386 | .mmap = generic_file_mmap, | 384 | .mmap = generic_file_mmap, |
387 | .open = hostfs_file_open, | 385 | .open = hostfs_file_open, |
388 | .release = hostfs_file_release, | 386 | .release = hostfs_file_release, |
diff --git a/fs/hpfs/file.c b/fs/hpfs/file.c index 7f54e5f76cec..6d8cfe9b52d6 100644 --- a/fs/hpfs/file.c +++ b/fs/hpfs/file.c | |||
@@ -197,9 +197,7 @@ const struct address_space_operations hpfs_aops = { | |||
197 | const struct file_operations hpfs_file_ops = | 197 | const struct file_operations hpfs_file_ops = |
198 | { | 198 | { |
199 | .llseek = generic_file_llseek, | 199 | .llseek = generic_file_llseek, |
200 | .read = new_sync_read, | ||
201 | .read_iter = generic_file_read_iter, | 200 | .read_iter = generic_file_read_iter, |
202 | .write = new_sync_write, | ||
203 | .write_iter = generic_file_write_iter, | 201 | .write_iter = generic_file_write_iter, |
204 | .mmap = generic_file_mmap, | 202 | .mmap = generic_file_mmap, |
205 | .release = hpfs_file_release, | 203 | .release = hpfs_file_release, |
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index db76cec3ce21..45e34908bdb5 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c | |||
@@ -34,6 +34,7 @@ | |||
34 | #include <linux/security.h> | 34 | #include <linux/security.h> |
35 | #include <linux/magic.h> | 35 | #include <linux/magic.h> |
36 | #include <linux/migrate.h> | 36 | #include <linux/migrate.h> |
37 | #include <linux/uio.h> | ||
37 | 38 | ||
38 | #include <asm/uaccess.h> | 39 | #include <asm/uaccess.h> |
39 | 40 | ||
@@ -179,42 +180,33 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr, | |||
179 | } | 180 | } |
180 | #endif | 181 | #endif |
181 | 182 | ||
182 | static int | 183 | static size_t |
183 | hugetlbfs_read_actor(struct page *page, unsigned long offset, | 184 | hugetlbfs_read_actor(struct page *page, unsigned long offset, |
184 | char __user *buf, unsigned long count, | 185 | struct iov_iter *to, unsigned long size) |
185 | unsigned long size) | ||
186 | { | 186 | { |
187 | char *kaddr; | 187 | size_t copied = 0; |
188 | unsigned long left, copied = 0; | ||
189 | int i, chunksize; | 188 | int i, chunksize; |
190 | 189 | ||
191 | if (size > count) | ||
192 | size = count; | ||
193 | |||
194 | /* Find which 4k chunk and offset with in that chunk */ | 190 | /* Find which 4k chunk and offset with in that chunk */ |
195 | i = offset >> PAGE_CACHE_SHIFT; | 191 | i = offset >> PAGE_CACHE_SHIFT; |
196 | offset = offset & ~PAGE_CACHE_MASK; | 192 | offset = offset & ~PAGE_CACHE_MASK; |
197 | 193 | ||
198 | while (size) { | 194 | while (size) { |
195 | size_t n; | ||
199 | chunksize = PAGE_CACHE_SIZE; | 196 | chunksize = PAGE_CACHE_SIZE; |
200 | if (offset) | 197 | if (offset) |
201 | chunksize -= offset; | 198 | chunksize -= offset; |
202 | if (chunksize > size) | 199 | if (chunksize > size) |
203 | chunksize = size; | 200 | chunksize = size; |
204 | kaddr = kmap(&page[i]); | 201 | n = copy_page_to_iter(&page[i], offset, chunksize, to); |
205 | left = __copy_to_user(buf, kaddr + offset, chunksize); | 202 | copied += n; |
206 | kunmap(&page[i]); | 203 | if (n != chunksize) |
207 | if (left) { | 204 | return copied; |
208 | copied += (chunksize - left); | ||
209 | break; | ||
210 | } | ||
211 | offset = 0; | 205 | offset = 0; |
212 | size -= chunksize; | 206 | size -= chunksize; |
213 | buf += chunksize; | ||
214 | copied += chunksize; | ||
215 | i++; | 207 | i++; |
216 | } | 208 | } |
217 | return copied ? copied : -EFAULT; | 209 | return copied; |
218 | } | 210 | } |
219 | 211 | ||
220 | /* | 212 | /* |
@@ -222,39 +214,34 @@ hugetlbfs_read_actor(struct page *page, unsigned long offset, | |||
222 | * data. Its *very* similar to do_generic_mapping_read(), we can't use that | 214 | * data. Its *very* similar to do_generic_mapping_read(), we can't use that |
223 | * since it has PAGE_CACHE_SIZE assumptions. | 215 | * since it has PAGE_CACHE_SIZE assumptions. |
224 | */ | 216 | */ |
225 | static ssize_t hugetlbfs_read(struct file *filp, char __user *buf, | 217 | static ssize_t hugetlbfs_read_iter(struct kiocb *iocb, struct iov_iter *to) |
226 | size_t len, loff_t *ppos) | ||
227 | { | 218 | { |
228 | struct hstate *h = hstate_file(filp); | 219 | struct file *file = iocb->ki_filp; |
229 | struct address_space *mapping = filp->f_mapping; | 220 | struct hstate *h = hstate_file(file); |
221 | struct address_space *mapping = file->f_mapping; | ||
230 | struct inode *inode = mapping->host; | 222 | struct inode *inode = mapping->host; |
231 | unsigned long index = *ppos >> huge_page_shift(h); | 223 | unsigned long index = iocb->ki_pos >> huge_page_shift(h); |
232 | unsigned long offset = *ppos & ~huge_page_mask(h); | 224 | unsigned long offset = iocb->ki_pos & ~huge_page_mask(h); |
233 | unsigned long end_index; | 225 | unsigned long end_index; |
234 | loff_t isize; | 226 | loff_t isize; |
235 | ssize_t retval = 0; | 227 | ssize_t retval = 0; |
236 | 228 | ||
237 | /* validate length */ | 229 | while (iov_iter_count(to)) { |
238 | if (len == 0) | ||
239 | goto out; | ||
240 | |||
241 | for (;;) { | ||
242 | struct page *page; | 230 | struct page *page; |
243 | unsigned long nr, ret; | 231 | size_t nr, copied; |
244 | int ra; | ||
245 | 232 | ||
246 | /* nr is the maximum number of bytes to copy from this page */ | 233 | /* nr is the maximum number of bytes to copy from this page */ |
247 | nr = huge_page_size(h); | 234 | nr = huge_page_size(h); |
248 | isize = i_size_read(inode); | 235 | isize = i_size_read(inode); |
249 | if (!isize) | 236 | if (!isize) |
250 | goto out; | 237 | break; |
251 | end_index = (isize - 1) >> huge_page_shift(h); | 238 | end_index = (isize - 1) >> huge_page_shift(h); |
252 | if (index >= end_index) { | 239 | if (index > end_index) |
253 | if (index > end_index) | 240 | break; |
254 | goto out; | 241 | if (index == end_index) { |
255 | nr = ((isize - 1) & ~huge_page_mask(h)) + 1; | 242 | nr = ((isize - 1) & ~huge_page_mask(h)) + 1; |
256 | if (nr <= offset) | 243 | if (nr <= offset) |
257 | goto out; | 244 | break; |
258 | } | 245 | } |
259 | nr = nr - offset; | 246 | nr = nr - offset; |
260 | 247 | ||
@@ -265,39 +252,27 @@ static ssize_t hugetlbfs_read(struct file *filp, char __user *buf, | |||
265 | * We have a HOLE, zero out the user-buffer for the | 252 | * We have a HOLE, zero out the user-buffer for the |
266 | * length of the hole or request. | 253 | * length of the hole or request. |
267 | */ | 254 | */ |
268 | ret = len < nr ? len : nr; | 255 | copied = iov_iter_zero(nr, to); |
269 | if (clear_user(buf, ret)) | ||
270 | ra = -EFAULT; | ||
271 | else | ||
272 | ra = 0; | ||
273 | } else { | 256 | } else { |
274 | unlock_page(page); | 257 | unlock_page(page); |
275 | 258 | ||
276 | /* | 259 | /* |
277 | * We have the page, copy it to user space buffer. | 260 | * We have the page, copy it to user space buffer. |
278 | */ | 261 | */ |
279 | ra = hugetlbfs_read_actor(page, offset, buf, len, nr); | 262 | copied = hugetlbfs_read_actor(page, offset, to, nr); |
280 | ret = ra; | ||
281 | page_cache_release(page); | 263 | page_cache_release(page); |
282 | } | 264 | } |
283 | if (ra < 0) { | 265 | offset += copied; |
284 | if (retval == 0) | 266 | retval += copied; |
285 | retval = ra; | 267 | if (copied != nr && iov_iter_count(to)) { |
286 | goto out; | 268 | if (!retval) |
269 | retval = -EFAULT; | ||
270 | break; | ||
287 | } | 271 | } |
288 | |||
289 | offset += ret; | ||
290 | retval += ret; | ||
291 | len -= ret; | ||
292 | index += offset >> huge_page_shift(h); | 272 | index += offset >> huge_page_shift(h); |
293 | offset &= ~huge_page_mask(h); | 273 | offset &= ~huge_page_mask(h); |
294 | |||
295 | /* short read or no more work */ | ||
296 | if ((ret != nr) || (len == 0)) | ||
297 | break; | ||
298 | } | 274 | } |
299 | out: | 275 | iocb->ki_pos = ((loff_t)index << huge_page_shift(h)) + offset; |
300 | *ppos = ((loff_t)index << huge_page_shift(h)) + offset; | ||
301 | return retval; | 276 | return retval; |
302 | } | 277 | } |
303 | 278 | ||
@@ -721,7 +696,7 @@ static void init_once(void *foo) | |||
721 | } | 696 | } |
722 | 697 | ||
723 | const struct file_operations hugetlbfs_file_operations = { | 698 | const struct file_operations hugetlbfs_file_operations = { |
724 | .read = hugetlbfs_read, | 699 | .read_iter = hugetlbfs_read_iter, |
725 | .mmap = hugetlbfs_file_mmap, | 700 | .mmap = hugetlbfs_file_mmap, |
726 | .fsync = noop_fsync, | 701 | .fsync = noop_fsync, |
727 | .get_unmapped_area = hugetlb_get_unmapped_area, | 702 | .get_unmapped_area = hugetlb_get_unmapped_area, |
diff --git a/fs/jffs2/file.c b/fs/jffs2/file.c index 64989ca9ba90..f509f62e12f6 100644 --- a/fs/jffs2/file.c +++ b/fs/jffs2/file.c | |||
@@ -51,9 +51,7 @@ const struct file_operations jffs2_file_operations = | |||
51 | { | 51 | { |
52 | .llseek = generic_file_llseek, | 52 | .llseek = generic_file_llseek, |
53 | .open = generic_file_open, | 53 | .open = generic_file_open, |
54 | .read = new_sync_read, | ||
55 | .read_iter = generic_file_read_iter, | 54 | .read_iter = generic_file_read_iter, |
56 | .write = new_sync_write, | ||
57 | .write_iter = generic_file_write_iter, | 55 | .write_iter = generic_file_write_iter, |
58 | .unlocked_ioctl=jffs2_ioctl, | 56 | .unlocked_ioctl=jffs2_ioctl, |
59 | .mmap = generic_file_readonly_mmap, | 57 | .mmap = generic_file_readonly_mmap, |
diff --git a/fs/jfs/file.c b/fs/jfs/file.c index 10815f8dfd8b..ae46788b9723 100644 --- a/fs/jfs/file.c +++ b/fs/jfs/file.c | |||
@@ -151,8 +151,6 @@ const struct inode_operations jfs_file_inode_operations = { | |||
151 | const struct file_operations jfs_file_operations = { | 151 | const struct file_operations jfs_file_operations = { |
152 | .open = jfs_open, | 152 | .open = jfs_open, |
153 | .llseek = generic_file_llseek, | 153 | .llseek = generic_file_llseek, |
154 | .write = new_sync_write, | ||
155 | .read = new_sync_read, | ||
156 | .read_iter = generic_file_read_iter, | 154 | .read_iter = generic_file_read_iter, |
157 | .write_iter = generic_file_write_iter, | 155 | .write_iter = generic_file_write_iter, |
158 | .mmap = generic_file_mmap, | 156 | .mmap = generic_file_mmap, |
diff --git a/fs/logfs/file.c b/fs/logfs/file.c index 8538752df2f6..b2c13f739ffa 100644 --- a/fs/logfs/file.c +++ b/fs/logfs/file.c | |||
@@ -271,8 +271,6 @@ const struct file_operations logfs_reg_fops = { | |||
271 | .llseek = generic_file_llseek, | 271 | .llseek = generic_file_llseek, |
272 | .mmap = generic_file_readonly_mmap, | 272 | .mmap = generic_file_readonly_mmap, |
273 | .open = generic_file_open, | 273 | .open = generic_file_open, |
274 | .read = new_sync_read, | ||
275 | .write = new_sync_write, | ||
276 | }; | 274 | }; |
277 | 275 | ||
278 | const struct address_space_operations logfs_reg_aops = { | 276 | const struct address_space_operations logfs_reg_aops = { |
diff --git a/fs/minix/file.c b/fs/minix/file.c index a967de085ac0..6d63e27ec961 100644 --- a/fs/minix/file.c +++ b/fs/minix/file.c | |||
@@ -14,9 +14,7 @@ | |||
14 | */ | 14 | */ |
15 | const struct file_operations minix_file_operations = { | 15 | const struct file_operations minix_file_operations = { |
16 | .llseek = generic_file_llseek, | 16 | .llseek = generic_file_llseek, |
17 | .read = new_sync_read, | ||
18 | .read_iter = generic_file_read_iter, | 17 | .read_iter = generic_file_read_iter, |
19 | .write = new_sync_write, | ||
20 | .write_iter = generic_file_write_iter, | 18 | .write_iter = generic_file_write_iter, |
21 | .mmap = generic_file_mmap, | 19 | .mmap = generic_file_mmap, |
22 | .fsync = generic_file_fsync, | 20 | .fsync = generic_file_fsync, |
diff --git a/fs/ncpfs/file.c b/fs/ncpfs/file.c index 1dd7007f974d..479bf8db264e 100644 --- a/fs/ncpfs/file.c +++ b/fs/ncpfs/file.c | |||
@@ -98,30 +98,24 @@ out: | |||
98 | } | 98 | } |
99 | 99 | ||
100 | static ssize_t | 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 | struct inode *inode = file_inode(file); | 104 | struct inode *inode = file_inode(file); |
104 | size_t already_read = 0; | 105 | size_t already_read = 0; |
105 | off_t pos; | 106 | off_t pos = iocb->ki_pos; |
106 | size_t bufsize; | 107 | size_t bufsize; |
107 | int error; | 108 | int error; |
108 | void* freepage; | 109 | void *freepage; |
109 | size_t freelen; | 110 | size_t freelen; |
110 | 111 | ||
111 | ncp_dbg(1, "enter %pD2\n", file); | 112 | ncp_dbg(1, "enter %pD2\n", file); |
112 | 113 | ||
113 | pos = *ppos; | 114 | if (!iov_iter_count(to)) |
114 | |||
115 | if ((ssize_t) count < 0) { | ||
116 | return -EINVAL; | ||
117 | } | ||
118 | if (!count) | ||
119 | return 0; | 115 | return 0; |
120 | if (pos > inode->i_sb->s_maxbytes) | 116 | if (pos > inode->i_sb->s_maxbytes) |
121 | return 0; | 117 | return 0; |
122 | if (pos + count > inode->i_sb->s_maxbytes) { | 118 | iov_iter_truncate(to, inode->i_sb->s_maxbytes - pos); |
123 | count = inode->i_sb->s_maxbytes - pos; | ||
124 | } | ||
125 | 119 | ||
126 | error = ncp_make_open(inode, O_RDONLY); | 120 | error = ncp_make_open(inode, O_RDONLY); |
127 | if (error) { | 121 | if (error) { |
@@ -138,31 +132,29 @@ ncp_file_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) | |||
138 | goto outrel; | 132 | goto outrel; |
139 | error = 0; | 133 | error = 0; |
140 | /* First read in as much as possible for each bufsize. */ | 134 | /* First read in as much as possible for each bufsize. */ |
141 | while (already_read < count) { | 135 | while (iov_iter_count(to)) { |
142 | int read_this_time; | 136 | int read_this_time; |
143 | size_t to_read = min_t(unsigned int, | 137 | size_t to_read = min_t(size_t, |
144 | bufsize - (pos % bufsize), | 138 | bufsize - (pos % bufsize), |
145 | count - already_read); | 139 | iov_iter_count(to)); |
146 | 140 | ||
147 | error = ncp_read_bounce(NCP_SERVER(inode), | 141 | error = ncp_read_bounce(NCP_SERVER(inode), |
148 | NCP_FINFO(inode)->file_handle, | 142 | NCP_FINFO(inode)->file_handle, |
149 | pos, to_read, buf, &read_this_time, | 143 | pos, to_read, to, &read_this_time, |
150 | freepage, freelen); | 144 | freepage, freelen); |
151 | if (error) { | 145 | if (error) { |
152 | error = -EIO; /* NW errno -> Linux errno */ | 146 | error = -EIO; /* NW errno -> Linux errno */ |
153 | break; | 147 | break; |
154 | } | 148 | } |
155 | pos += read_this_time; | 149 | pos += read_this_time; |
156 | buf += read_this_time; | ||
157 | already_read += read_this_time; | 150 | already_read += read_this_time; |
158 | 151 | ||
159 | if (read_this_time != to_read) { | 152 | if (read_this_time != to_read) |
160 | break; | 153 | break; |
161 | } | ||
162 | } | 154 | } |
163 | vfree(freepage); | 155 | vfree(freepage); |
164 | 156 | ||
165 | *ppos = pos; | 157 | iocb->ki_pos = pos; |
166 | 158 | ||
167 | file_accessed(file); | 159 | file_accessed(file); |
168 | 160 | ||
@@ -173,42 +165,26 @@ outrel: | |||
173 | } | 165 | } |
174 | 166 | ||
175 | static ssize_t | 167 | static ssize_t |
176 | ncp_file_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) | 168 | ncp_file_write_iter(struct kiocb *iocb, struct iov_iter *from) |
177 | { | 169 | { |
170 | struct file *file = iocb->ki_filp; | ||
178 | struct inode *inode = file_inode(file); | 171 | struct inode *inode = file_inode(file); |
179 | size_t already_written = 0; | 172 | size_t already_written = 0; |
180 | off_t pos; | 173 | loff_t pos = iocb->ki_pos; |
174 | size_t count = iov_iter_count(from); | ||
181 | size_t bufsize; | 175 | size_t bufsize; |
182 | int errno; | 176 | int errno; |
183 | void* bouncebuffer; | 177 | void *bouncebuffer; |
184 | 178 | ||
185 | ncp_dbg(1, "enter %pD2\n", file); | 179 | ncp_dbg(1, "enter %pD2\n", file); |
186 | if ((ssize_t) count < 0) | 180 | errno = generic_write_checks(file, &pos, &count, 0); |
187 | return -EINVAL; | 181 | if (errno) |
188 | pos = *ppos; | 182 | return errno; |
189 | if (file->f_flags & O_APPEND) { | 183 | iov_iter_truncate(from, count); |
190 | pos = i_size_read(inode); | ||
191 | } | ||
192 | |||
193 | if (pos + count > MAX_NON_LFS && !(file->f_flags&O_LARGEFILE)) { | ||
194 | if (pos >= MAX_NON_LFS) { | ||
195 | return -EFBIG; | ||
196 | } | ||
197 | if (count > MAX_NON_LFS - (u32)pos) { | ||
198 | count = MAX_NON_LFS - (u32)pos; | ||
199 | } | ||
200 | } | ||
201 | if (pos >= inode->i_sb->s_maxbytes) { | ||
202 | if (count || pos > inode->i_sb->s_maxbytes) { | ||
203 | return -EFBIG; | ||
204 | } | ||
205 | } | ||
206 | if (pos + count > inode->i_sb->s_maxbytes) { | ||
207 | count = inode->i_sb->s_maxbytes - pos; | ||
208 | } | ||
209 | 184 | ||
210 | if (!count) | 185 | if (!count) |
211 | return 0; | 186 | return 0; |
187 | |||
212 | errno = ncp_make_open(inode, O_WRONLY); | 188 | errno = ncp_make_open(inode, O_WRONLY); |
213 | if (errno) { | 189 | if (errno) { |
214 | ncp_dbg(1, "open failed, error=%d\n", errno); | 190 | ncp_dbg(1, "open failed, error=%d\n", errno); |
@@ -216,8 +192,6 @@ ncp_file_write(struct file *file, const char __user *buf, size_t count, loff_t * | |||
216 | } | 192 | } |
217 | bufsize = NCP_SERVER(inode)->buffer_size; | 193 | bufsize = NCP_SERVER(inode)->buffer_size; |
218 | 194 | ||
219 | already_written = 0; | ||
220 | |||
221 | errno = file_update_time(file); | 195 | errno = file_update_time(file); |
222 | if (errno) | 196 | if (errno) |
223 | goto outrel; | 197 | goto outrel; |
@@ -227,13 +201,13 @@ ncp_file_write(struct file *file, const char __user *buf, size_t count, loff_t * | |||
227 | errno = -EIO; /* -ENOMEM */ | 201 | errno = -EIO; /* -ENOMEM */ |
228 | goto outrel; | 202 | goto outrel; |
229 | } | 203 | } |
230 | while (already_written < count) { | 204 | while (iov_iter_count(from)) { |
231 | int written_this_time; | 205 | int written_this_time; |
232 | size_t to_write = min_t(unsigned int, | 206 | size_t to_write = min_t(size_t, |
233 | bufsize - (pos % bufsize), | 207 | bufsize - ((off_t)pos % bufsize), |
234 | count - already_written); | 208 | iov_iter_count(from)); |
235 | 209 | ||
236 | if (copy_from_user(bouncebuffer, buf, to_write)) { | 210 | if (copy_from_iter(bouncebuffer, to_write, from) != to_write) { |
237 | errno = -EFAULT; | 211 | errno = -EFAULT; |
238 | break; | 212 | break; |
239 | } | 213 | } |
@@ -244,16 +218,14 @@ ncp_file_write(struct file *file, const char __user *buf, size_t count, loff_t * | |||
244 | break; | 218 | break; |
245 | } | 219 | } |
246 | pos += written_this_time; | 220 | pos += written_this_time; |
247 | buf += written_this_time; | ||
248 | already_written += written_this_time; | 221 | already_written += written_this_time; |
249 | 222 | ||
250 | if (written_this_time != to_write) { | 223 | if (written_this_time != to_write) |
251 | break; | 224 | break; |
252 | } | ||
253 | } | 225 | } |
254 | vfree(bouncebuffer); | 226 | vfree(bouncebuffer); |
255 | 227 | ||
256 | *ppos = pos; | 228 | iocb->ki_pos = pos; |
257 | 229 | ||
258 | if (pos > i_size_read(inode)) { | 230 | if (pos > i_size_read(inode)) { |
259 | mutex_lock(&inode->i_mutex); | 231 | mutex_lock(&inode->i_mutex); |
@@ -277,8 +249,8 @@ static int ncp_release(struct inode *inode, struct file *file) { | |||
277 | const struct file_operations ncp_file_operations = | 249 | const struct file_operations ncp_file_operations = |
278 | { | 250 | { |
279 | .llseek = generic_file_llseek, | 251 | .llseek = generic_file_llseek, |
280 | .read = ncp_file_read, | 252 | .read_iter = ncp_file_read_iter, |
281 | .write = ncp_file_write, | 253 | .write_iter = ncp_file_write_iter, |
282 | .unlocked_ioctl = ncp_ioctl, | 254 | .unlocked_ioctl = ncp_ioctl, |
283 | #ifdef CONFIG_COMPAT | 255 | #ifdef CONFIG_COMPAT |
284 | .compat_ioctl = ncp_compat_ioctl, | 256 | .compat_ioctl = ncp_compat_ioctl, |
diff --git a/fs/ncpfs/ncplib_kernel.c b/fs/ncpfs/ncplib_kernel.c index 482387532f54..2b502a0d7941 100644 --- a/fs/ncpfs/ncplib_kernel.c +++ b/fs/ncpfs/ncplib_kernel.c | |||
@@ -1001,8 +1001,8 @@ out: | |||
1001 | */ | 1001 | */ |
1002 | int | 1002 | int |
1003 | ncp_read_bounce(struct ncp_server *server, const char *file_id, | 1003 | ncp_read_bounce(struct ncp_server *server, const char *file_id, |
1004 | __u32 offset, __u16 to_read, char __user *target, int *bytes_read, | 1004 | __u32 offset, __u16 to_read, struct iov_iter *to, |
1005 | void* bounce, __u32 bufsize) | 1005 | int *bytes_read, void *bounce, __u32 bufsize) |
1006 | { | 1006 | { |
1007 | int result; | 1007 | int result; |
1008 | 1008 | ||
@@ -1025,7 +1025,7 @@ ncp_read_bounce(struct ncp_server *server, const char *file_id, | |||
1025 | (offset & 1); | 1025 | (offset & 1); |
1026 | *bytes_read = len; | 1026 | *bytes_read = len; |
1027 | result = 0; | 1027 | result = 0; |
1028 | if (copy_to_user(target, source, len)) | 1028 | if (copy_to_iter(source, len, to) != len) |
1029 | result = -EFAULT; | 1029 | result = -EFAULT; |
1030 | } | 1030 | } |
1031 | } | 1031 | } |
diff --git a/fs/ncpfs/ncplib_kernel.h b/fs/ncpfs/ncplib_kernel.h index 250e443a07f3..5233fbc1747a 100644 --- a/fs/ncpfs/ncplib_kernel.h +++ b/fs/ncpfs/ncplib_kernel.h | |||
@@ -53,7 +53,7 @@ static inline int ncp_read_bounce_size(__u32 size) { | |||
53 | return sizeof(struct ncp_reply_header) + 2 + 2 + size + 8; | 53 | return sizeof(struct ncp_reply_header) + 2 + 2 + size + 8; |
54 | }; | 54 | }; |
55 | int ncp_read_bounce(struct ncp_server *, const char *, __u32, __u16, | 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 | int ncp_read_kernel(struct ncp_server *, const char *, __u32, __u16, | 57 | int ncp_read_kernel(struct ncp_server *, const char *, __u32, __u16, |
58 | char *, int *); | 58 | char *, int *); |
59 | int ncp_write_kernel(struct ncp_server *, const char *, __u32, __u16, | 59 | int ncp_write_kernel(struct ncp_server *, const char *, __u32, __u16, |
diff --git a/fs/nfs/file.c b/fs/nfs/file.c index 37b15582e0de..f6a3adedf027 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c | |||
@@ -926,8 +926,6 @@ EXPORT_SYMBOL_GPL(nfs_flock); | |||
926 | 926 | ||
927 | const struct file_operations nfs_file_operations = { | 927 | const struct file_operations nfs_file_operations = { |
928 | .llseek = nfs_file_llseek, | 928 | .llseek = nfs_file_llseek, |
929 | .read = new_sync_read, | ||
930 | .write = new_sync_write, | ||
931 | .read_iter = nfs_file_read, | 929 | .read_iter = nfs_file_read, |
932 | .write_iter = nfs_file_write, | 930 | .write_iter = nfs_file_write, |
933 | .mmap = nfs_file_mmap, | 931 | .mmap = nfs_file_mmap, |
diff --git a/fs/nfs/nfs4file.c b/fs/nfs/nfs4file.c index 8b46389c4c5b..0181cde1d102 100644 --- a/fs/nfs/nfs4file.c +++ b/fs/nfs/nfs4file.c | |||
@@ -170,8 +170,6 @@ const struct file_operations nfs4_file_operations = { | |||
170 | #else | 170 | #else |
171 | .llseek = nfs_file_llseek, | 171 | .llseek = nfs_file_llseek, |
172 | #endif | 172 | #endif |
173 | .read = new_sync_read, | ||
174 | .write = new_sync_write, | ||
175 | .read_iter = nfs_file_read, | 173 | .read_iter = nfs_file_read, |
176 | .write_iter = nfs_file_write, | 174 | .write_iter = nfs_file_write, |
177 | .mmap = nfs_file_mmap, | 175 | .mmap = nfs_file_mmap, |
diff --git a/fs/nilfs2/file.c b/fs/nilfs2/file.c index a8c728acb7a8..54575e3cc1a2 100644 --- a/fs/nilfs2/file.c +++ b/fs/nilfs2/file.c | |||
@@ -143,8 +143,6 @@ static int nilfs_file_mmap(struct file *file, struct vm_area_struct *vma) | |||
143 | */ | 143 | */ |
144 | const struct file_operations nilfs_file_operations = { | 144 | const struct file_operations nilfs_file_operations = { |
145 | .llseek = generic_file_llseek, | 145 | .llseek = generic_file_llseek, |
146 | .read = new_sync_read, | ||
147 | .write = new_sync_write, | ||
148 | .read_iter = generic_file_read_iter, | 146 | .read_iter = generic_file_read_iter, |
149 | .write_iter = generic_file_write_iter, | 147 | .write_iter = generic_file_write_iter, |
150 | .unlocked_ioctl = nilfs_ioctl, | 148 | .unlocked_ioctl = nilfs_ioctl, |
diff --git a/fs/ntfs/file.c b/fs/ntfs/file.c index c1da78dad1af..840e95e3f1d2 100644 --- a/fs/ntfs/file.c +++ b/fs/ntfs/file.c | |||
@@ -2048,10 +2048,8 @@ static int ntfs_file_fsync(struct file *filp, loff_t start, loff_t end, | |||
2048 | 2048 | ||
2049 | const struct file_operations ntfs_file_ops = { | 2049 | const struct file_operations ntfs_file_ops = { |
2050 | .llseek = generic_file_llseek, | 2050 | .llseek = generic_file_llseek, |
2051 | .read = new_sync_read, | ||
2052 | .read_iter = generic_file_read_iter, | 2051 | .read_iter = generic_file_read_iter, |
2053 | #ifdef NTFS_RW | 2052 | #ifdef NTFS_RW |
2054 | .write = new_sync_write, | ||
2055 | .write_iter = ntfs_file_write_iter, | 2053 | .write_iter = ntfs_file_write_iter, |
2056 | .fsync = ntfs_file_fsync, | 2054 | .fsync = ntfs_file_fsync, |
2057 | #endif /* NTFS_RW */ | 2055 | #endif /* NTFS_RW */ |
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index 91f03ce98108..8c48e989beba 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c | |||
@@ -2681,8 +2681,6 @@ const struct inode_operations ocfs2_special_file_iops = { | |||
2681 | */ | 2681 | */ |
2682 | const struct file_operations ocfs2_fops = { | 2682 | const struct file_operations ocfs2_fops = { |
2683 | .llseek = ocfs2_file_llseek, | 2683 | .llseek = ocfs2_file_llseek, |
2684 | .read = new_sync_read, | ||
2685 | .write = new_sync_write, | ||
2686 | .mmap = ocfs2_mmap, | 2684 | .mmap = ocfs2_mmap, |
2687 | .fsync = ocfs2_sync_file, | 2685 | .fsync = ocfs2_sync_file, |
2688 | .release = ocfs2_file_release, | 2686 | .release = ocfs2_file_release, |
@@ -2729,8 +2727,6 @@ const struct file_operations ocfs2_dops = { | |||
2729 | */ | 2727 | */ |
2730 | const struct file_operations ocfs2_fops_no_plocks = { | 2728 | const struct file_operations ocfs2_fops_no_plocks = { |
2731 | .llseek = ocfs2_file_llseek, | 2729 | .llseek = ocfs2_file_llseek, |
2732 | .read = new_sync_read, | ||
2733 | .write = new_sync_write, | ||
2734 | .mmap = ocfs2_mmap, | 2730 | .mmap = ocfs2_mmap, |
2735 | .fsync = ocfs2_sync_file, | 2731 | .fsync = ocfs2_sync_file, |
2736 | .release = ocfs2_file_release, | 2732 | .release = ocfs2_file_release, |
diff --git a/fs/omfs/file.c b/fs/omfs/file.c index 902e88527fce..f993be7f2156 100644 --- a/fs/omfs/file.c +++ b/fs/omfs/file.c | |||
@@ -337,8 +337,6 @@ static sector_t omfs_bmap(struct address_space *mapping, sector_t block) | |||
337 | 337 | ||
338 | const struct file_operations omfs_file_operations = { | 338 | const struct file_operations omfs_file_operations = { |
339 | .llseek = generic_file_llseek, | 339 | .llseek = generic_file_llseek, |
340 | .read = new_sync_read, | ||
341 | .write = new_sync_write, | ||
342 | .read_iter = generic_file_read_iter, | 340 | .read_iter = generic_file_read_iter, |
343 | .write_iter = generic_file_write_iter, | 341 | .write_iter = generic_file_write_iter, |
344 | .mmap = generic_file_mmap, | 342 | .mmap = generic_file_mmap, |
@@ -734,10 +734,10 @@ static int do_dentry_open(struct file *f, | |||
734 | if ((f->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) | 734 | if ((f->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) |
735 | i_readcount_inc(inode); | 735 | i_readcount_inc(inode); |
736 | if ((f->f_mode & FMODE_READ) && | 736 | if ((f->f_mode & FMODE_READ) && |
737 | likely(f->f_op->read || f->f_op->aio_read || f->f_op->read_iter)) | 737 | likely(f->f_op->read || f->f_op->read_iter)) |
738 | f->f_mode |= FMODE_CAN_READ; | 738 | f->f_mode |= FMODE_CAN_READ; |
739 | if ((f->f_mode & FMODE_WRITE) && | 739 | if ((f->f_mode & FMODE_WRITE) && |
740 | likely(f->f_op->write || f->f_op->aio_write || f->f_op->write_iter)) | 740 | likely(f->f_op->write || f->f_op->write_iter)) |
741 | f->f_mode |= FMODE_CAN_WRITE; | 741 | f->f_mode |= FMODE_CAN_WRITE; |
742 | 742 | ||
743 | f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC); | 743 | f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC); |
@@ -946,9 +946,7 @@ err: | |||
946 | const struct file_operations pipefifo_fops = { | 946 | const struct file_operations pipefifo_fops = { |
947 | .open = fifo_open, | 947 | .open = fifo_open, |
948 | .llseek = no_llseek, | 948 | .llseek = no_llseek, |
949 | .read = new_sync_read, | ||
950 | .read_iter = pipe_read, | 949 | .read_iter = pipe_read, |
951 | .write = new_sync_write, | ||
952 | .write_iter = pipe_write, | 950 | .write_iter = pipe_write, |
953 | .poll = pipe_poll, | 951 | .poll = pipe_poll, |
954 | .unlocked_ioctl = pipe_ioctl, | 952 | .unlocked_ioctl = pipe_ioctl, |
diff --git a/fs/ramfs/file-mmu.c b/fs/ramfs/file-mmu.c index 4f56de822d2f..183a212694bf 100644 --- a/fs/ramfs/file-mmu.c +++ b/fs/ramfs/file-mmu.c | |||
@@ -31,9 +31,7 @@ | |||
31 | #include "internal.h" | 31 | #include "internal.h" |
32 | 32 | ||
33 | const struct file_operations ramfs_file_operations = { | 33 | const struct file_operations ramfs_file_operations = { |
34 | .read = new_sync_read, | ||
35 | .read_iter = generic_file_read_iter, | 34 | .read_iter = generic_file_read_iter, |
36 | .write = new_sync_write, | ||
37 | .write_iter = generic_file_write_iter, | 35 | .write_iter = generic_file_write_iter, |
38 | .mmap = generic_file_mmap, | 36 | .mmap = generic_file_mmap, |
39 | .fsync = noop_fsync, | 37 | .fsync = noop_fsync, |
diff --git a/fs/ramfs/file-nommu.c b/fs/ramfs/file-nommu.c index f6ab41b39612..0b38befa69f3 100644 --- a/fs/ramfs/file-nommu.c +++ b/fs/ramfs/file-nommu.c | |||
@@ -44,9 +44,7 @@ const struct file_operations ramfs_file_operations = { | |||
44 | .mmap_capabilities = ramfs_mmap_capabilities, | 44 | .mmap_capabilities = ramfs_mmap_capabilities, |
45 | .mmap = ramfs_nommu_mmap, | 45 | .mmap = ramfs_nommu_mmap, |
46 | .get_unmapped_area = ramfs_nommu_get_unmapped_area, | 46 | .get_unmapped_area = ramfs_nommu_get_unmapped_area, |
47 | .read = new_sync_read, | ||
48 | .read_iter = generic_file_read_iter, | 47 | .read_iter = generic_file_read_iter, |
49 | .write = new_sync_write, | ||
50 | .write_iter = generic_file_write_iter, | 48 | .write_iter = generic_file_write_iter, |
51 | .fsync = noop_fsync, | 49 | .fsync = noop_fsync, |
52 | .splice_read = generic_file_splice_read, | 50 | .splice_read = generic_file_splice_read, |
diff --git a/fs/read_write.c b/fs/read_write.c index 69128b378646..45d583c33879 100644 --- a/fs/read_write.c +++ b/fs/read_write.c | |||
@@ -22,13 +22,10 @@ | |||
22 | #include <asm/unistd.h> | 22 | #include <asm/unistd.h> |
23 | 23 | ||
24 | typedef ssize_t (*io_fn_t)(struct file *, char __user *, size_t, loff_t *); | 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 | typedef ssize_t (*iter_fn_t)(struct kiocb *, struct iov_iter *); | 25 | typedef ssize_t (*iter_fn_t)(struct kiocb *, struct iov_iter *); |
28 | 26 | ||
29 | const struct file_operations generic_ro_fops = { | 27 | const struct file_operations generic_ro_fops = { |
30 | .llseek = generic_file_llseek, | 28 | .llseek = generic_file_llseek, |
31 | .read = new_sync_read, | ||
32 | .read_iter = generic_file_read_iter, | 29 | .read_iter = generic_file_read_iter, |
33 | .mmap = generic_file_readonly_mmap, | 30 | .mmap = generic_file_readonly_mmap, |
34 | .splice_read = generic_file_splice_read, | 31 | .splice_read = generic_file_splice_read, |
@@ -411,24 +408,7 @@ int rw_verify_area(int read_write, struct file *file, const loff_t *ppos, size_t | |||
411 | return count > MAX_RW_COUNT ? MAX_RW_COUNT : count; | 408 | return count > MAX_RW_COUNT ? MAX_RW_COUNT : count; |
412 | } | 409 | } |
413 | 410 | ||
414 | ssize_t do_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos) | 411 | static ssize_t new_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos) |
415 | { | ||
416 | struct iovec iov = { .iov_base = buf, .iov_len = len }; | ||
417 | struct kiocb kiocb; | ||
418 | ssize_t ret; | ||
419 | |||
420 | init_sync_kiocb(&kiocb, filp); | ||
421 | kiocb.ki_pos = *ppos; | ||
422 | |||
423 | ret = filp->f_op->aio_read(&kiocb, &iov, 1, kiocb.ki_pos); | ||
424 | BUG_ON(ret == -EIOCBQUEUED); | ||
425 | *ppos = kiocb.ki_pos; | ||
426 | return ret; | ||
427 | } | ||
428 | |||
429 | EXPORT_SYMBOL(do_sync_read); | ||
430 | |||
431 | ssize_t new_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos) | ||
432 | { | 412 | { |
433 | struct iovec iov = { .iov_base = buf, .iov_len = len }; | 413 | struct iovec iov = { .iov_base = buf, .iov_len = len }; |
434 | struct kiocb kiocb; | 414 | struct kiocb kiocb; |
@@ -445,24 +425,17 @@ ssize_t new_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *p | |||
445 | return ret; | 425 | return ret; |
446 | } | 426 | } |
447 | 427 | ||
448 | EXPORT_SYMBOL(new_sync_read); | ||
449 | |||
450 | ssize_t __vfs_read(struct file *file, char __user *buf, size_t count, | 428 | ssize_t __vfs_read(struct file *file, char __user *buf, size_t count, |
451 | loff_t *pos) | 429 | loff_t *pos) |
452 | { | 430 | { |
453 | ssize_t ret; | ||
454 | |||
455 | if (file->f_op->read) | 431 | if (file->f_op->read) |
456 | ret = file->f_op->read(file, buf, count, pos); | 432 | return file->f_op->read(file, buf, count, pos); |
457 | else if (file->f_op->aio_read) | ||
458 | ret = do_sync_read(file, buf, count, pos); | ||
459 | else if (file->f_op->read_iter) | 433 | else if (file->f_op->read_iter) |
460 | ret = new_sync_read(file, buf, count, pos); | 434 | return new_sync_read(file, buf, count, pos); |
461 | else | 435 | else |
462 | ret = -EINVAL; | 436 | return -EINVAL; |
463 | |||
464 | return ret; | ||
465 | } | 437 | } |
438 | EXPORT_SYMBOL(__vfs_read); | ||
466 | 439 | ||
467 | ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos) | 440 | ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos) |
468 | { | 441 | { |
@@ -491,24 +464,7 @@ ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos) | |||
491 | 464 | ||
492 | EXPORT_SYMBOL(vfs_read); | 465 | EXPORT_SYMBOL(vfs_read); |
493 | 466 | ||
494 | ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos) | 467 | static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos) |
495 | { | ||
496 | struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = len }; | ||
497 | struct kiocb kiocb; | ||
498 | ssize_t ret; | ||
499 | |||
500 | init_sync_kiocb(&kiocb, filp); | ||
501 | kiocb.ki_pos = *ppos; | ||
502 | |||
503 | ret = filp->f_op->aio_write(&kiocb, &iov, 1, kiocb.ki_pos); | ||
504 | BUG_ON(ret == -EIOCBQUEUED); | ||
505 | *ppos = kiocb.ki_pos; | ||
506 | return ret; | ||
507 | } | ||
508 | |||
509 | EXPORT_SYMBOL(do_sync_write); | ||
510 | |||
511 | ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos) | ||
512 | { | 468 | { |
513 | struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = len }; | 469 | struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = len }; |
514 | struct kiocb kiocb; | 470 | struct kiocb kiocb; |
@@ -525,7 +481,17 @@ ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, lo | |||
525 | return ret; | 481 | return ret; |
526 | } | 482 | } |
527 | 483 | ||
528 | EXPORT_SYMBOL(new_sync_write); | 484 | ssize_t __vfs_write(struct file *file, const char __user *p, size_t count, |
485 | loff_t *pos) | ||
486 | { | ||
487 | if (file->f_op->write) | ||
488 | return file->f_op->write(file, p, count, pos); | ||
489 | else if (file->f_op->write_iter) | ||
490 | return new_sync_write(file, p, count, pos); | ||
491 | else | ||
492 | return -EINVAL; | ||
493 | } | ||
494 | EXPORT_SYMBOL(__vfs_write); | ||
529 | 495 | ||
530 | ssize_t __kernel_write(struct file *file, const char *buf, size_t count, loff_t *pos) | 496 | ssize_t __kernel_write(struct file *file, const char *buf, size_t count, loff_t *pos) |
531 | { | 497 | { |
@@ -541,12 +507,7 @@ ssize_t __kernel_write(struct file *file, const char *buf, size_t count, loff_t | |||
541 | p = (__force const char __user *)buf; | 507 | p = (__force const char __user *)buf; |
542 | if (count > MAX_RW_COUNT) | 508 | if (count > MAX_RW_COUNT) |
543 | count = MAX_RW_COUNT; | 509 | count = MAX_RW_COUNT; |
544 | if (file->f_op->write) | 510 | ret = __vfs_write(file, p, count, pos); |
545 | ret = file->f_op->write(file, p, count, pos); | ||
546 | else if (file->f_op->aio_write) | ||
547 | ret = do_sync_write(file, p, count, pos); | ||
548 | else | ||
549 | ret = new_sync_write(file, p, count, pos); | ||
550 | set_fs(old_fs); | 511 | set_fs(old_fs); |
551 | if (ret > 0) { | 512 | if (ret > 0) { |
552 | fsnotify_modify(file); | 513 | fsnotify_modify(file); |
@@ -573,12 +534,7 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_ | |||
573 | if (ret >= 0) { | 534 | if (ret >= 0) { |
574 | count = ret; | 535 | count = ret; |
575 | file_start_write(file); | 536 | file_start_write(file); |
576 | if (file->f_op->write) | 537 | ret = __vfs_write(file, buf, count, pos); |
577 | ret = file->f_op->write(file, buf, count, pos); | ||
578 | else if (file->f_op->aio_write) | ||
579 | ret = do_sync_write(file, buf, count, pos); | ||
580 | else | ||
581 | ret = new_sync_write(file, buf, count, pos); | ||
582 | if (ret > 0) { | 538 | if (ret > 0) { |
583 | fsnotify_modify(file); | 539 | fsnotify_modify(file); |
584 | add_wchar(current, ret); | 540 | add_wchar(current, ret); |
@@ -710,21 +666,6 @@ static ssize_t do_iter_readv_writev(struct file *filp, struct iov_iter *iter, | |||
710 | return ret; | 666 | return ret; |
711 | } | 667 | } |
712 | 668 | ||
713 | static ssize_t do_sync_readv_writev(struct file *filp, struct iov_iter *iter, | ||
714 | loff_t *ppos, iov_fn_t fn) | ||
715 | { | ||
716 | struct kiocb kiocb; | ||
717 | ssize_t ret; | ||
718 | |||
719 | init_sync_kiocb(&kiocb, filp); | ||
720 | kiocb.ki_pos = *ppos; | ||
721 | |||
722 | ret = fn(&kiocb, iter->iov, iter->nr_segs, kiocb.ki_pos); | ||
723 | BUG_ON(ret == -EIOCBQUEUED); | ||
724 | *ppos = kiocb.ki_pos; | ||
725 | return ret; | ||
726 | } | ||
727 | |||
728 | /* Do it by hand, with file-ops */ | 669 | /* Do it by hand, with file-ops */ |
729 | static ssize_t do_loop_readv_writev(struct file *filp, struct iov_iter *iter, | 670 | static ssize_t do_loop_readv_writev(struct file *filp, struct iov_iter *iter, |
730 | loff_t *ppos, io_fn_t fn) | 671 | loff_t *ppos, io_fn_t fn) |
@@ -839,7 +780,6 @@ static ssize_t do_readv_writev(int type, struct file *file, | |||
839 | struct iov_iter iter; | 780 | struct iov_iter iter; |
840 | ssize_t ret; | 781 | ssize_t ret; |
841 | io_fn_t fn; | 782 | io_fn_t fn; |
842 | iov_fn_t fnv; | ||
843 | iter_fn_t iter_fn; | 783 | iter_fn_t iter_fn; |
844 | 784 | ||
845 | ret = import_iovec(type, uvector, nr_segs, | 785 | ret = import_iovec(type, uvector, nr_segs, |
@@ -854,22 +794,17 @@ static ssize_t do_readv_writev(int type, struct file *file, | |||
854 | if (ret < 0) | 794 | if (ret < 0) |
855 | goto out; | 795 | goto out; |
856 | 796 | ||
857 | fnv = NULL; | ||
858 | if (type == READ) { | 797 | if (type == READ) { |
859 | fn = file->f_op->read; | 798 | fn = file->f_op->read; |
860 | fnv = file->f_op->aio_read; | ||
861 | iter_fn = file->f_op->read_iter; | 799 | iter_fn = file->f_op->read_iter; |
862 | } else { | 800 | } else { |
863 | fn = (io_fn_t)file->f_op->write; | 801 | fn = (io_fn_t)file->f_op->write; |
864 | fnv = file->f_op->aio_write; | ||
865 | iter_fn = file->f_op->write_iter; | 802 | iter_fn = file->f_op->write_iter; |
866 | file_start_write(file); | 803 | file_start_write(file); |
867 | } | 804 | } |
868 | 805 | ||
869 | if (iter_fn) | 806 | if (iter_fn) |
870 | ret = do_iter_readv_writev(file, &iter, pos, iter_fn); | 807 | ret = do_iter_readv_writev(file, &iter, pos, iter_fn); |
871 | else if (fnv) | ||
872 | ret = do_sync_readv_writev(file, &iter, pos, fnv); | ||
873 | else | 808 | else |
874 | ret = do_loop_readv_writev(file, &iter, pos, fn); | 809 | ret = do_loop_readv_writev(file, &iter, pos, fn); |
875 | 810 | ||
@@ -1019,7 +954,6 @@ static ssize_t compat_do_readv_writev(int type, struct file *file, | |||
1019 | struct iov_iter iter; | 954 | struct iov_iter iter; |
1020 | ssize_t ret; | 955 | ssize_t ret; |
1021 | io_fn_t fn; | 956 | io_fn_t fn; |
1022 | iov_fn_t fnv; | ||
1023 | iter_fn_t iter_fn; | 957 | iter_fn_t iter_fn; |
1024 | 958 | ||
1025 | ret = compat_import_iovec(type, uvector, nr_segs, | 959 | ret = compat_import_iovec(type, uvector, nr_segs, |
@@ -1034,22 +968,17 @@ static ssize_t compat_do_readv_writev(int type, struct file *file, | |||
1034 | if (ret < 0) | 968 | if (ret < 0) |
1035 | goto out; | 969 | goto out; |
1036 | 970 | ||
1037 | fnv = NULL; | ||
1038 | if (type == READ) { | 971 | if (type == READ) { |
1039 | fn = file->f_op->read; | 972 | fn = file->f_op->read; |
1040 | fnv = file->f_op->aio_read; | ||
1041 | iter_fn = file->f_op->read_iter; | 973 | iter_fn = file->f_op->read_iter; |
1042 | } else { | 974 | } else { |
1043 | fn = (io_fn_t)file->f_op->write; | 975 | fn = (io_fn_t)file->f_op->write; |
1044 | fnv = file->f_op->aio_write; | ||
1045 | iter_fn = file->f_op->write_iter; | 976 | iter_fn = file->f_op->write_iter; |
1046 | file_start_write(file); | 977 | file_start_write(file); |
1047 | } | 978 | } |
1048 | 979 | ||
1049 | if (iter_fn) | 980 | if (iter_fn) |
1050 | ret = do_iter_readv_writev(file, &iter, pos, iter_fn); | 981 | ret = do_iter_readv_writev(file, &iter, pos, iter_fn); |
1051 | else if (fnv) | ||
1052 | ret = do_sync_readv_writev(file, &iter, pos, fnv); | ||
1053 | else | 982 | else |
1054 | ret = do_loop_readv_writev(file, &iter, pos, fn); | 983 | ret = do_loop_readv_writev(file, &iter, pos, fn); |
1055 | 984 | ||
diff --git a/fs/reiserfs/file.c b/fs/reiserfs/file.c index 751dd3f4346b..96a1bcf33db4 100644 --- a/fs/reiserfs/file.c +++ b/fs/reiserfs/file.c | |||
@@ -243,8 +243,6 @@ drop_write_lock: | |||
243 | } | 243 | } |
244 | 244 | ||
245 | const struct file_operations reiserfs_file_operations = { | 245 | const struct file_operations reiserfs_file_operations = { |
246 | .read = new_sync_read, | ||
247 | .write = new_sync_write, | ||
248 | .unlocked_ioctl = reiserfs_ioctl, | 246 | .unlocked_ioctl = reiserfs_ioctl, |
249 | #ifdef CONFIG_COMPAT | 247 | #ifdef CONFIG_COMPAT |
250 | .compat_ioctl = reiserfs_compat_ioctl, | 248 | .compat_ioctl = reiserfs_compat_ioctl, |
diff --git a/fs/romfs/mmap-nommu.c b/fs/romfs/mmap-nommu.c index 7da9e2153953..1118a0dc6b45 100644 --- a/fs/romfs/mmap-nommu.c +++ b/fs/romfs/mmap-nommu.c | |||
@@ -81,7 +81,6 @@ static unsigned romfs_mmap_capabilities(struct file *file) | |||
81 | 81 | ||
82 | const struct file_operations romfs_ro_fops = { | 82 | const struct file_operations romfs_ro_fops = { |
83 | .llseek = generic_file_llseek, | 83 | .llseek = generic_file_llseek, |
84 | .read = new_sync_read, | ||
85 | .read_iter = generic_file_read_iter, | 84 | .read_iter = generic_file_read_iter, |
86 | .splice_read = generic_file_splice_read, | 85 | .splice_read = generic_file_splice_read, |
87 | .mmap = romfs_mmap, | 86 | .mmap = romfs_mmap, |
diff --git a/fs/sysv/file.c b/fs/sysv/file.c index b00811c75b24..a48e30410ad1 100644 --- a/fs/sysv/file.c +++ b/fs/sysv/file.c | |||
@@ -21,9 +21,7 @@ | |||
21 | */ | 21 | */ |
22 | const struct file_operations sysv_file_operations = { | 22 | const struct file_operations sysv_file_operations = { |
23 | .llseek = generic_file_llseek, | 23 | .llseek = generic_file_llseek, |
24 | .read = new_sync_read, | ||
25 | .read_iter = generic_file_read_iter, | 24 | .read_iter = generic_file_read_iter, |
26 | .write = new_sync_write, | ||
27 | .write_iter = generic_file_write_iter, | 25 | .write_iter = generic_file_write_iter, |
28 | .mmap = generic_file_mmap, | 26 | .mmap = generic_file_mmap, |
29 | .fsync = generic_file_fsync, | 27 | .fsync = generic_file_fsync, |
diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c index c3d15fe83403..475b15635f11 100644 --- a/fs/ubifs/file.c +++ b/fs/ubifs/file.c | |||
@@ -1580,8 +1580,6 @@ const struct inode_operations ubifs_symlink_inode_operations = { | |||
1580 | 1580 | ||
1581 | const struct file_operations ubifs_file_operations = { | 1581 | const struct file_operations ubifs_file_operations = { |
1582 | .llseek = generic_file_llseek, | 1582 | .llseek = generic_file_llseek, |
1583 | .read = new_sync_read, | ||
1584 | .write = new_sync_write, | ||
1585 | .read_iter = generic_file_read_iter, | 1583 | .read_iter = generic_file_read_iter, |
1586 | .write_iter = ubifs_write_iter, | 1584 | .write_iter = ubifs_write_iter, |
1587 | .mmap = ubifs_file_mmap, | 1585 | .mmap = ubifs_file_mmap, |
diff --git a/fs/udf/file.c b/fs/udf/file.c index 7f885cc8b0b7..74050bff64f4 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c | |||
@@ -240,12 +240,10 @@ static int udf_release_file(struct inode *inode, struct file *filp) | |||
240 | } | 240 | } |
241 | 241 | ||
242 | const struct file_operations udf_file_operations = { | 242 | const struct file_operations udf_file_operations = { |
243 | .read = new_sync_read, | ||
244 | .read_iter = generic_file_read_iter, | 243 | .read_iter = generic_file_read_iter, |
245 | .unlocked_ioctl = udf_ioctl, | 244 | .unlocked_ioctl = udf_ioctl, |
246 | .open = generic_file_open, | 245 | .open = generic_file_open, |
247 | .mmap = generic_file_mmap, | 246 | .mmap = generic_file_mmap, |
248 | .write = new_sync_write, | ||
249 | .write_iter = udf_file_write_iter, | 247 | .write_iter = udf_file_write_iter, |
250 | .release = udf_release_file, | 248 | .release = udf_release_file, |
251 | .fsync = generic_file_fsync, | 249 | .fsync = generic_file_fsync, |
diff --git a/fs/ufs/file.c b/fs/ufs/file.c index c84ec010a676..042ddbf110cc 100644 --- a/fs/ufs/file.c +++ b/fs/ufs/file.c | |||
@@ -35,9 +35,7 @@ | |||
35 | 35 | ||
36 | const struct file_operations ufs_file_operations = { | 36 | const struct file_operations ufs_file_operations = { |
37 | .llseek = generic_file_llseek, | 37 | .llseek = generic_file_llseek, |
38 | .read = new_sync_read, | ||
39 | .read_iter = generic_file_read_iter, | 38 | .read_iter = generic_file_read_iter, |
40 | .write = new_sync_write, | ||
41 | .write_iter = generic_file_write_iter, | 39 | .write_iter = generic_file_write_iter, |
42 | .mmap = generic_file_mmap, | 40 | .mmap = generic_file_mmap, |
43 | .open = generic_file_open, | 41 | .open = generic_file_open, |
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index f44212fae653..44856c3b9617 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c | |||
@@ -1386,8 +1386,6 @@ xfs_file_llseek( | |||
1386 | 1386 | ||
1387 | const struct file_operations xfs_file_operations = { | 1387 | const struct file_operations xfs_file_operations = { |
1388 | .llseek = xfs_file_llseek, | 1388 | .llseek = xfs_file_llseek, |
1389 | .read = new_sync_read, | ||
1390 | .write = new_sync_write, | ||
1391 | .read_iter = xfs_file_read_iter, | 1389 | .read_iter = xfs_file_read_iter, |
1392 | .write_iter = xfs_file_write_iter, | 1390 | .write_iter = xfs_file_write_iter, |
1393 | .splice_read = xfs_file_splice_read, | 1391 | .splice_read = xfs_file_splice_read, |