aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/9p/vfs_file.c83
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
376static ssize_t 376static ssize_t
377v9fs_file_read(struct file *filp, char __user *udata, size_t count, 377v9fs_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 */
405static ssize_t 401static ssize_t
406v9fs_file_write(struct file *filp, const char __user * data, 402v9fs_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
452static int v9fs_file_fsync(struct file *filp, loff_t start, loff_t end, 441static 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 */
586static ssize_t 575static ssize_t
587v9fs_mmap_file_read(struct file *filp, char __user *data, size_t count, 576v9fs_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 */
602static ssize_t 590static ssize_t
603v9fs_mmap_file_write(struct file *filp, const char __user *data, 591v9fs_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
613static void v9fs_mmap_vm_close(struct vm_area_struct *vma) 600static 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
680const struct file_operations v9fs_file_operations = { 667const 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
691const struct file_operations v9fs_file_operations_dotl = { 680const 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
703const struct file_operations v9fs_mmap_file_operations = { 694const 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
714const struct file_operations v9fs_mmap_file_operations_dotl = { 707const 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,