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 /fs/9p/vfs_file.c | |
| parent | 42b1ab979d92d21ae2ea376e77f33f18973b9581 (diff) | |
9p: switch to ->read_iter/->write_iter
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/9p/vfs_file.c')
| -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, |
