diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2015-04-01 23:59:57 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2015-04-11 22:28:28 -0400 |
commit | e494b6b5e1034db00571c44e089e6fe3845b6e8c (patch) | |
tree | f5cfd7b5cd6b82d23c4861d0ee0ac845c6ddad4a | |
parent | 42b1ab979d92d21ae2ea376e77f33f18973b9581 (diff) |
9p: switch to ->read_iter/->write_iter
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | fs/9p/vfs_file.c | 83 |
1 files changed, 39 insertions, 44 deletions
diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c index 53a1c85b8a20..0ac2969c9c2e 100644 --- a/fs/9p/vfs_file.c +++ b/fs/9p/vfs_file.c | |||
@@ -374,23 +374,19 @@ out_err: | |||
374 | */ | 374 | */ |
375 | 375 | ||
376 | static ssize_t | 376 | static ssize_t |
377 | v9fs_file_read(struct file *filp, char __user *udata, size_t count, | 377 | v9fs_file_read_iter(struct kiocb *iocb, struct iov_iter *to) |
378 | loff_t * offset) | ||
379 | { | 378 | { |
380 | struct p9_fid *fid = filp->private_data; | 379 | struct p9_fid *fid = iocb->ki_filp->private_data; |
381 | struct iovec iov = {.iov_base = udata, .iov_len = count}; | ||
382 | struct iov_iter to; | ||
383 | int ret, err; | 380 | int ret, err; |
384 | 381 | ||
385 | iov_iter_init(&to, READ, &iov, 1, count); | 382 | p9_debug(P9_DEBUG_VFS, "count %zu offset %lld\n", |
383 | iov_iter_count(to), iocb->ki_pos); | ||
386 | 384 | ||
387 | p9_debug(P9_DEBUG_VFS, "count %zu offset %lld\n", count, *offset); | 385 | ret = p9_client_read(fid, iocb->ki_pos, to, &err); |
388 | |||
389 | ret = p9_client_read(fid, *offset, &to, &err); | ||
390 | if (!ret) | 386 | if (!ret) |
391 | return err; | 387 | return err; |
392 | 388 | ||
393 | *offset += ret; | 389 | iocb->ki_pos += ret; |
394 | return ret; | 390 | return ret; |
395 | } | 391 | } |
396 | 392 | ||
@@ -403,33 +399,26 @@ v9fs_file_read(struct file *filp, char __user *udata, size_t count, | |||
403 | * | 399 | * |
404 | */ | 400 | */ |
405 | static ssize_t | 401 | static ssize_t |
406 | v9fs_file_write(struct file *filp, const char __user * data, | 402 | v9fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) |
407 | size_t count, loff_t *offset) | ||
408 | { | 403 | { |
404 | struct file *file = iocb->ki_filp; | ||
409 | ssize_t retval = 0; | 405 | ssize_t retval = 0; |
410 | loff_t origin = *offset; | 406 | loff_t origin = iocb->ki_pos; |
411 | struct iovec iov = {.iov_base = (void __user *)data, .iov_len = count}; | 407 | size_t count = iov_iter_count(from); |
412 | struct iov_iter from; | ||
413 | int err = 0; | 408 | int err = 0; |
414 | 409 | ||
415 | iov_iter_init(&from, WRITE, &iov, 1, count); | 410 | retval = generic_write_checks(file, &origin, &count, 0); |
416 | |||
417 | retval = generic_write_checks(filp, &origin, &count, 0); | ||
418 | if (retval) | 411 | if (retval) |
419 | return retval; | 412 | return retval; |
420 | 413 | ||
421 | iov_iter_truncate(&from, count); | 414 | iov_iter_truncate(from, count); |
422 | |||
423 | p9_debug(P9_DEBUG_VFS, "data %p count %d offset %x\n", | ||
424 | data, (int)count, (int)*offset); | ||
425 | 415 | ||
426 | retval = 0; | ||
427 | if (!count) | 416 | if (!count) |
428 | return 0; | 417 | return 0; |
429 | 418 | ||
430 | retval = p9_client_write(filp->private_data, origin, &from, &err); | 419 | retval = p9_client_write(file->private_data, origin, from, &err); |
431 | if (retval > 0) { | 420 | if (retval > 0) { |
432 | struct inode *inode = file_inode(filp); | 421 | struct inode *inode = file_inode(file); |
433 | loff_t i_size; | 422 | loff_t i_size; |
434 | unsigned long pg_start, pg_end; | 423 | unsigned long pg_start, pg_end; |
435 | pg_start = origin >> PAGE_CACHE_SHIFT; | 424 | pg_start = origin >> PAGE_CACHE_SHIFT; |
@@ -437,18 +426,18 @@ v9fs_file_write(struct file *filp, const char __user * data, | |||
437 | if (inode->i_mapping && inode->i_mapping->nrpages) | 426 | if (inode->i_mapping && inode->i_mapping->nrpages) |
438 | invalidate_inode_pages2_range(inode->i_mapping, | 427 | invalidate_inode_pages2_range(inode->i_mapping, |
439 | pg_start, pg_end); | 428 | pg_start, pg_end); |
440 | *offset += retval; | 429 | origin += retval; |
441 | i_size = i_size_read(inode); | 430 | i_size = i_size_read(inode); |
442 | if (*offset > i_size) { | 431 | iocb->ki_pos = origin; |
443 | inode_add_bytes(inode, *offset - i_size); | 432 | if (origin > i_size) { |
444 | i_size_write(inode, *offset); | 433 | inode_add_bytes(inode, origin - i_size); |
434 | i_size_write(inode, origin); | ||
445 | } | 435 | } |
446 | return retval; | 436 | return retval; |
447 | } | 437 | } |
448 | return err; | 438 | return err; |
449 | } | 439 | } |
450 | 440 | ||
451 | |||
452 | static int v9fs_file_fsync(struct file *filp, loff_t start, loff_t end, | 441 | static int v9fs_file_fsync(struct file *filp, loff_t start, loff_t end, |
453 | int datasync) | 442 | int datasync) |
454 | { | 443 | { |
@@ -584,11 +573,10 @@ out_unlock: | |||
584 | * | 573 | * |
585 | */ | 574 | */ |
586 | static ssize_t | 575 | static ssize_t |
587 | v9fs_mmap_file_read(struct file *filp, char __user *data, size_t count, | 576 | v9fs_mmap_file_read_iter(struct kiocb *iocb, struct iov_iter *to) |
588 | loff_t *offset) | ||
589 | { | 577 | { |
590 | /* TODO: Check if there are dirty pages */ | 578 | /* TODO: Check if there are dirty pages */ |
591 | return v9fs_file_read(filp, data, count, offset); | 579 | return v9fs_file_read_iter(iocb, to); |
592 | } | 580 | } |
593 | 581 | ||
594 | /** | 582 | /** |
@@ -600,14 +588,13 @@ v9fs_mmap_file_read(struct file *filp, char __user *data, size_t count, | |||
600 | * | 588 | * |
601 | */ | 589 | */ |
602 | static ssize_t | 590 | static ssize_t |
603 | v9fs_mmap_file_write(struct file *filp, const char __user *data, | 591 | v9fs_mmap_file_write_iter(struct kiocb *iocb, struct iov_iter *from) |
604 | size_t count, loff_t *offset) | ||
605 | { | 592 | { |
606 | /* | 593 | /* |
607 | * TODO: invalidate mmaps on filp's inode between | 594 | * TODO: invalidate mmaps on filp's inode between |
608 | * offset and offset+count | 595 | * offset and offset+count |
609 | */ | 596 | */ |
610 | return v9fs_file_write(filp, data, count, offset); | 597 | return v9fs_file_write_iter(iocb, from); |
611 | } | 598 | } |
612 | 599 | ||
613 | static void v9fs_mmap_vm_close(struct vm_area_struct *vma) | 600 | static void v9fs_mmap_vm_close(struct vm_area_struct *vma) |
@@ -679,8 +666,10 @@ const struct file_operations v9fs_cached_file_operations_dotl = { | |||
679 | 666 | ||
680 | const struct file_operations v9fs_file_operations = { | 667 | const struct file_operations v9fs_file_operations = { |
681 | .llseek = generic_file_llseek, | 668 | .llseek = generic_file_llseek, |
682 | .read = v9fs_file_read, | 669 | .read = new_sync_read, |
683 | .write = v9fs_file_write, | 670 | .write = new_sync_write, |
671 | .read_iter = v9fs_file_read_iter, | ||
672 | .write_iter = v9fs_file_write_iter, | ||
684 | .open = v9fs_file_open, | 673 | .open = v9fs_file_open, |
685 | .release = v9fs_dir_release, | 674 | .release = v9fs_dir_release, |
686 | .lock = v9fs_file_lock, | 675 | .lock = v9fs_file_lock, |
@@ -690,8 +679,10 @@ const struct file_operations v9fs_file_operations = { | |||
690 | 679 | ||
691 | const struct file_operations v9fs_file_operations_dotl = { | 680 | const struct file_operations v9fs_file_operations_dotl = { |
692 | .llseek = generic_file_llseek, | 681 | .llseek = generic_file_llseek, |
693 | .read = v9fs_file_read, | 682 | .read = new_sync_read, |
694 | .write = v9fs_file_write, | 683 | .write = new_sync_write, |
684 | .read_iter = v9fs_file_read_iter, | ||
685 | .write_iter = v9fs_file_write_iter, | ||
695 | .open = v9fs_file_open, | 686 | .open = v9fs_file_open, |
696 | .release = v9fs_dir_release, | 687 | .release = v9fs_dir_release, |
697 | .lock = v9fs_file_lock_dotl, | 688 | .lock = v9fs_file_lock_dotl, |
@@ -702,8 +693,10 @@ const struct file_operations v9fs_file_operations_dotl = { | |||
702 | 693 | ||
703 | const struct file_operations v9fs_mmap_file_operations = { | 694 | const struct file_operations v9fs_mmap_file_operations = { |
704 | .llseek = generic_file_llseek, | 695 | .llseek = generic_file_llseek, |
705 | .read = v9fs_mmap_file_read, | 696 | .read = new_sync_read, |
706 | .write = v9fs_mmap_file_write, | 697 | .write = new_sync_write, |
698 | .read_iter = v9fs_mmap_file_read_iter, | ||
699 | .write_iter = v9fs_mmap_file_write_iter, | ||
707 | .open = v9fs_file_open, | 700 | .open = v9fs_file_open, |
708 | .release = v9fs_dir_release, | 701 | .release = v9fs_dir_release, |
709 | .lock = v9fs_file_lock, | 702 | .lock = v9fs_file_lock, |
@@ -713,8 +706,10 @@ const struct file_operations v9fs_mmap_file_operations = { | |||
713 | 706 | ||
714 | const struct file_operations v9fs_mmap_file_operations_dotl = { | 707 | const struct file_operations v9fs_mmap_file_operations_dotl = { |
715 | .llseek = generic_file_llseek, | 708 | .llseek = generic_file_llseek, |
716 | .read = v9fs_mmap_file_read, | 709 | .read = new_sync_read, |
717 | .write = v9fs_mmap_file_write, | 710 | .write = new_sync_write, |
711 | .read_iter = v9fs_mmap_file_read_iter, | ||
712 | .write_iter = v9fs_mmap_file_write_iter, | ||
718 | .open = v9fs_file_open, | 713 | .open = v9fs_file_open, |
719 | .release = v9fs_dir_release, | 714 | .release = v9fs_dir_release, |
720 | .lock = v9fs_file_lock_dotl, | 715 | .lock = v9fs_file_lock_dotl, |