diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2015-04-01 22:04:46 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2015-04-11 22:28:26 -0400 |
commit | c711a6b111322941a41bb024dbcc22b9858d5dd6 (patch) | |
tree | c42cd8e1b4de3f9ce6a54da17b349dec73269ac4 /fs/9p | |
parent | 371098c6a689da81fbb53bf7acf128f89a6efa09 (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.h | 2 | ||||
-rw-r--r-- | fs/9p/vfs_file.c | 77 |
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); | |||
74 | int v9fs_vfs_setattr_dotl(struct dentry *, struct iattr *); | 74 | int v9fs_vfs_setattr_dotl(struct dentry *, struct iattr *); |
75 | int v9fs_file_fsync_dotl(struct file *filp, loff_t start, loff_t end, | 75 | int v9fs_file_fsync_dotl(struct file *filp, loff_t start, loff_t end, |
76 | int datasync); | 76 | 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); | 77 | int v9fs_refresh_inode(struct p9_fid *fid, struct inode *inode); |
80 | int v9fs_refresh_inode_dotl(struct p9_fid *fid, struct inode *inode); | 78 | int v9fs_refresh_inode_dotl(struct p9_fid *fid, struct inode *inode); |
81 | static inline void v9fs_invalidate_inode_attr(struct inode *inode) | 79 | static 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 | ||
456 | ssize_t | ||
457 | v9fs_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; |
523 | out: | 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 | ||