aboutsummaryrefslogtreecommitdiffstats
path: root/fs/9p
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2015-04-01 22:04:46 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2015-04-11 22:28:26 -0400
commitc711a6b111322941a41bb024dbcc22b9858d5dd6 (patch)
treec42cd8e1b4de3f9ce6a54da17b349dec73269ac4 /fs/9p
parent371098c6a689da81fbb53bf7acf128f89a6efa09 (diff)
9p: fold v9fs_file_write_internal() into the caller
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/9p')
-rw-r--r--fs/9p/v9fs_vfs.h2
-rw-r--r--fs/9p/vfs_file.c77
2 files changed, 30 insertions, 49 deletions
diff --git a/fs/9p/v9fs_vfs.h b/fs/9p/v9fs_vfs.h
index b83ebfbf3fdc..cff1e61d9355 100644
--- a/fs/9p/v9fs_vfs.h
+++ b/fs/9p/v9fs_vfs.h
@@ -74,8 +74,6 @@ void v9fs_blank_wstat(struct p9_wstat *wstat);
74int v9fs_vfs_setattr_dotl(struct dentry *, struct iattr *); 74int v9fs_vfs_setattr_dotl(struct dentry *, struct iattr *);
75int v9fs_file_fsync_dotl(struct file *filp, loff_t start, loff_t end, 75int v9fs_file_fsync_dotl(struct file *filp, loff_t start, loff_t end,
76 int datasync); 76 int datasync);
77ssize_t v9fs_file_write_internal(struct inode *, struct p9_fid *,
78 const char __user *, size_t, loff_t *, int);
79int v9fs_refresh_inode(struct p9_fid *fid, struct inode *inode); 77int v9fs_refresh_inode(struct p9_fid *fid, struct inode *inode);
80int v9fs_refresh_inode_dotl(struct p9_fid *fid, struct inode *inode); 78int v9fs_refresh_inode_dotl(struct p9_fid *fid, struct inode *inode);
81static inline void v9fs_invalidate_inode_attr(struct inode *inode) 79static inline void v9fs_invalidate_inode_attr(struct inode *inode)
diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c
index 75a2bb01420d..a54d81f9097f 100644
--- a/fs/9p/vfs_file.c
+++ b/fs/9p/vfs_file.c
@@ -453,40 +453,6 @@ v9fs_file_read(struct file *filp, char __user *udata, size_t count,
453 return ret; 453 return ret;
454} 454}
455 455
456ssize_t
457v9fs_file_write_internal(struct inode *inode, struct p9_fid *fid,
458 const char __user *data, size_t count,
459 loff_t *offset, int invalidate)
460{
461 loff_t origin = *offset;
462 struct iovec iov = {.iov_base = (void __user *)data, .iov_len = count};
463 struct iov_iter from;
464 int total, err = 0;
465
466 p9_debug(P9_DEBUG_VFS, "data %p count %d offset %x\n",
467 data, (int)count, (int)*offset);
468
469 iov_iter_init(&from, WRITE, &iov, 1, count);
470
471 total = p9_client_write(fid, origin, &from, &err);
472 if (invalidate && (total > 0)) {
473 loff_t i_size;
474 unsigned long pg_start, pg_end;
475 pg_start = origin >> PAGE_CACHE_SHIFT;
476 pg_end = (origin + total - 1) >> PAGE_CACHE_SHIFT;
477 if (inode->i_mapping && inode->i_mapping->nrpages)
478 invalidate_inode_pages2_range(inode->i_mapping,
479 pg_start, pg_end);
480 *offset += total;
481 i_size = i_size_read(inode);
482 if (*offset > i_size) {
483 inode_add_bytes(inode, *offset - i_size);
484 i_size_write(inode, *offset);
485 }
486 }
487 return total ? total : err;
488}
489
490/** 456/**
491 * v9fs_file_write - write to a file 457 * v9fs_file_write - write to a file
492 * @filp: file pointer to write 458 * @filp: file pointer to write
@@ -501,27 +467,44 @@ v9fs_file_write(struct file *filp, const char __user * data,
501{ 467{
502 ssize_t retval = 0; 468 ssize_t retval = 0;
503 loff_t origin = *offset; 469 loff_t origin = *offset;
470 struct iovec iov = {.iov_base = (void __user *)data, .iov_len = count};
471 struct iov_iter from;
472 int err = 0;
504 473
474 iov_iter_init(&from, WRITE, &iov, 1, count);
505 475
506 retval = generic_write_checks(filp, &origin, &count, 0); 476 retval = generic_write_checks(filp, &origin, &count, 0);
507 if (retval) 477 if (retval)
508 goto out; 478 return retval;
479
480 iov_iter_truncate(&from, count);
481
482 p9_debug(P9_DEBUG_VFS, "data %p count %d offset %x\n",
483 data, (int)count, (int)*offset);
509 484
510 retval = -EINVAL;
511 if ((ssize_t) count < 0)
512 goto out;
513 retval = 0; 485 retval = 0;
514 if (!count) 486 if (!count)
515 goto out; 487 return 0;
516 488
517 retval = v9fs_file_write_internal(file_inode(filp), 489 retval = p9_client_write(filp->private_data, origin, &from, &err);
518 filp->private_data, 490 if (retval > 0) {
519 data, count, &origin, 1); 491 struct inode *inode = file_inode(filp);
520 /* update offset on successful write */ 492 loff_t i_size;
521 if (retval > 0) 493 unsigned long pg_start, pg_end;
522 *offset = origin; 494 pg_start = origin >> PAGE_CACHE_SHIFT;
523out: 495 pg_end = (origin + retval - 1) >> PAGE_CACHE_SHIFT;
524 return retval; 496 if (inode->i_mapping && inode->i_mapping->nrpages)
497 invalidate_inode_pages2_range(inode->i_mapping,
498 pg_start, pg_end);
499 *offset += retval;
500 i_size = i_size_read(inode);
501 if (*offset > i_size) {
502 inode_add_bytes(inode, *offset - i_size);
503 i_size_write(inode, *offset);
504 }
505 return retval;
506 }
507 return err;
525} 508}
526 509
527 510