aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cifs
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2015-04-09 12:55:47 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2015-04-11 22:30:21 -0400
commit3309dd04cbcd2cdad168485af5cf3576b5051e49 (patch)
tree3e01f865306dee01b31f34c9e7e819a5f42a4087 /fs/cifs
parent90320251db0fe3d05f2b10686ec936c7d6ecd99a (diff)
switch generic_write_checks() to iocb and iter
... returning -E... upon error and amount of data left in iter after (possible) truncation upon success. Note, that normal case gives a non-zero (positive) return value, so any tests for != 0 _must_ be updated. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Conflicts: fs/ext4/file.c
Diffstat (limited to 'fs/cifs')
-rw-r--r--fs/cifs/file.c26
1 files changed, 6 insertions, 20 deletions
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index 4202e74b2db5..ca2bc5406306 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -2563,7 +2563,6 @@ cifs_write_from_iter(loff_t offset, size_t len, struct iov_iter *from,
2563ssize_t cifs_user_writev(struct kiocb *iocb, struct iov_iter *from) 2563ssize_t cifs_user_writev(struct kiocb *iocb, struct iov_iter *from)
2564{ 2564{
2565 struct file *file = iocb->ki_filp; 2565 struct file *file = iocb->ki_filp;
2566 size_t len;
2567 ssize_t total_written = 0; 2566 ssize_t total_written = 0;
2568 struct cifsFileInfo *open_file; 2567 struct cifsFileInfo *open_file;
2569 struct cifs_tcon *tcon; 2568 struct cifs_tcon *tcon;
@@ -2579,16 +2578,10 @@ ssize_t cifs_user_writev(struct kiocb *iocb, struct iov_iter *from)
2579 * write request. 2578 * write request.
2580 */ 2579 */
2581 2580
2582 len = iov_iter_count(from); 2581 rc = generic_write_checks(iocb, from);
2583 rc = generic_write_checks(file, &iocb->ki_pos, &len); 2582 if (rc <= 0)
2584 if (rc)
2585 return rc; 2583 return rc;
2586 2584
2587 if (!len)
2588 return 0;
2589
2590 iov_iter_truncate(from, len);
2591
2592 INIT_LIST_HEAD(&wdata_list); 2585 INIT_LIST_HEAD(&wdata_list);
2593 cifs_sb = CIFS_FILE_SB(file); 2586 cifs_sb = CIFS_FILE_SB(file);
2594 open_file = file->private_data; 2587 open_file = file->private_data;
@@ -2599,8 +2592,8 @@ ssize_t cifs_user_writev(struct kiocb *iocb, struct iov_iter *from)
2599 2592
2600 memcpy(&saved_from, from, sizeof(struct iov_iter)); 2593 memcpy(&saved_from, from, sizeof(struct iov_iter));
2601 2594
2602 rc = cifs_write_from_iter(iocb->ki_pos, len, from, open_file, cifs_sb, 2595 rc = cifs_write_from_iter(iocb->ki_pos, iov_iter_count(from), from,
2603 &wdata_list); 2596 open_file, cifs_sb, &wdata_list);
2604 2597
2605 /* 2598 /*
2606 * If at least one write was successfully sent, then discard any rc 2599 * If at least one write was successfully sent, then discard any rc
@@ -2674,7 +2667,6 @@ cifs_writev(struct kiocb *iocb, struct iov_iter *from)
2674 struct cifsInodeInfo *cinode = CIFS_I(inode); 2667 struct cifsInodeInfo *cinode = CIFS_I(inode);
2675 struct TCP_Server_Info *server = tlink_tcon(cfile->tlink)->ses->server; 2668 struct TCP_Server_Info *server = tlink_tcon(cfile->tlink)->ses->server;
2676 ssize_t rc; 2669 ssize_t rc;
2677 size_t count;
2678 2670
2679 /* 2671 /*
2680 * We need to hold the sem to be sure nobody modifies lock list 2672 * We need to hold the sem to be sure nobody modifies lock list
@@ -2683,16 +2675,10 @@ cifs_writev(struct kiocb *iocb, struct iov_iter *from)
2683 down_read(&cinode->lock_sem); 2675 down_read(&cinode->lock_sem);
2684 mutex_lock(&inode->i_mutex); 2676 mutex_lock(&inode->i_mutex);
2685 2677
2686 count = iov_iter_count(from); 2678 rc = generic_write_checks(iocb, from);
2687 rc = generic_write_checks(file, &iocb->ki_pos, &count); 2679 if (rc <= 0)
2688 if (rc)
2689 goto out; 2680 goto out;
2690 2681
2691 if (count == 0)
2692 goto out;
2693
2694 iov_iter_truncate(from, count);
2695
2696 if (!cifs_find_lock_conflict(cfile, iocb->ki_pos, iov_iter_count(from), 2682 if (!cifs_find_lock_conflict(cfile, iocb->ki_pos, iov_iter_count(from),
2697 server->vals->exclusive_lock_type, NULL, 2683 server->vals->exclusive_lock_type, NULL,
2698 CIFS_WRITE_OP)) 2684 CIFS_WRITE_OP))