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/nfs | |
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/nfs')
-rw-r--r-- | fs/nfs/direct.c | 25 |
1 files changed, 10 insertions, 15 deletions
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index 5ddd77acb3f7..9634189b8545 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c | |||
@@ -969,24 +969,19 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter, | |||
969 | struct nfs_direct_req *dreq; | 969 | struct nfs_direct_req *dreq; |
970 | struct nfs_lock_context *l_ctx; | 970 | struct nfs_lock_context *l_ctx; |
971 | loff_t end; | 971 | loff_t end; |
972 | size_t count = iov_iter_count(iter); | ||
973 | end = (pos + count - 1) >> PAGE_CACHE_SHIFT; | ||
974 | |||
975 | nfs_add_stats(mapping->host, NFSIOS_DIRECTWRITTENBYTES, count); | ||
976 | 972 | ||
977 | dfprintk(FILE, "NFS: direct write(%pD2, %zd@%Ld)\n", | 973 | dfprintk(FILE, "NFS: direct write(%pD2, %zd@%Ld)\n", |
978 | file, count, (long long) pos); | 974 | file, iov_iter_count(iter), (long long) iocb->ki_pos); |
979 | 975 | ||
980 | result = generic_write_checks(file, &pos, &count); | 976 | result = generic_write_checks(iocb, iter); |
981 | if (result) | 977 | if (result <= 0) |
982 | goto out; | 978 | goto out; |
983 | 979 | ||
984 | result = -EINVAL; | 980 | nfs_add_stats(mapping->host, NFSIOS_DIRECTWRITTENBYTES, |
985 | if ((ssize_t) count < 0) | 981 | iov_iter_count(iter)); |
986 | goto out; | 982 | |
987 | result = 0; | 983 | pos = iocb->ki_pos; |
988 | if (!count) | 984 | end = (pos + iov_iter_count(iter) - 1) >> PAGE_CACHE_SHIFT; |
989 | goto out; | ||
990 | 985 | ||
991 | mutex_lock(&inode->i_mutex); | 986 | mutex_lock(&inode->i_mutex); |
992 | 987 | ||
@@ -1001,7 +996,7 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter, | |||
1001 | goto out_unlock; | 996 | goto out_unlock; |
1002 | } | 997 | } |
1003 | 998 | ||
1004 | task_io_account_write(count); | 999 | task_io_account_write(iov_iter_count(iter)); |
1005 | 1000 | ||
1006 | result = -ENOMEM; | 1001 | result = -ENOMEM; |
1007 | dreq = nfs_direct_req_alloc(); | 1002 | dreq = nfs_direct_req_alloc(); |
@@ -1009,7 +1004,7 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter, | |||
1009 | goto out_unlock; | 1004 | goto out_unlock; |
1010 | 1005 | ||
1011 | dreq->inode = inode; | 1006 | dreq->inode = inode; |
1012 | dreq->bytes_left = count; | 1007 | dreq->bytes_left = iov_iter_count(iter); |
1013 | dreq->io_start = pos; | 1008 | dreq->io_start = pos; |
1014 | dreq->ctx = get_nfs_open_context(nfs_file_open_context(iocb->ki_filp)); | 1009 | dreq->ctx = get_nfs_open_context(nfs_file_open_context(iocb->ki_filp)); |
1015 | l_ctx = nfs_get_lock_context(dreq->ctx); | 1010 | l_ctx = nfs_get_lock_context(dreq->ctx); |