diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2015-04-09 12:55:47 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2015-04-11 22:30:21 -0400 |
commit | 3309dd04cbcd2cdad168485af5cf3576b5051e49 (patch) | |
tree | 3e01f865306dee01b31f34c9e7e819a5f42a4087 /fs/cifs | |
parent | 90320251db0fe3d05f2b10686ec936c7d6ecd99a (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.c | 26 |
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, | |||
2563 | ssize_t cifs_user_writev(struct kiocb *iocb, struct iov_iter *from) | 2563 | ssize_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)) |