|
@@ -988,6 +988,7 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,
|
|
|
ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter)
|
|
|
{
|
|
|
ssize_t result = -EINVAL;
|
|
|
+ size_t count;
|
|
|
struct file *file = iocb->ki_filp;
|
|
|
struct address_space *mapping = file->f_mapping;
|
|
|
struct inode *inode = mapping->host;
|
|
@@ -998,8 +999,11 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter)
|
|
|
dfprintk(FILE, "NFS: direct write(%pD2, %zd@%Ld)\n",
|
|
|
file, iov_iter_count(iter), (long long) iocb->ki_pos);
|
|
|
|
|
|
- nfs_add_stats(mapping->host, NFSIOS_DIRECTWRITTENBYTES,
|
|
|
- iov_iter_count(iter));
|
|
|
+ result = generic_write_checks(iocb, iter);
|
|
|
+ if (result <= 0)
|
|
|
+ return result;
|
|
|
+ count = result;
|
|
|
+ nfs_add_stats(mapping->host, NFSIOS_DIRECTWRITTENBYTES, count);
|
|
|
|
|
|
pos = iocb->ki_pos;
|
|
|
end = (pos + iov_iter_count(iter) - 1) >> PAGE_SHIFT;
|
|
@@ -1017,7 +1021,7 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter)
|
|
|
goto out_unlock;
|
|
|
}
|
|
|
|
|
|
- task_io_account_write(iov_iter_count(iter));
|
|
|
+ task_io_account_write(count);
|
|
|
|
|
|
result = -ENOMEM;
|
|
|
dreq = nfs_direct_req_alloc();
|
|
@@ -1025,7 +1029,7 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter)
|
|
|
goto out_unlock;
|
|
|
|
|
|
dreq->inode = inode;
|
|
|
- dreq->bytes_left = dreq->max_count = iov_iter_count(iter);
|
|
|
+ dreq->bytes_left = dreq->max_count = count;
|
|
|
dreq->io_start = pos;
|
|
|
dreq->ctx = get_nfs_open_context(nfs_file_open_context(iocb->ki_filp));
|
|
|
l_ctx = nfs_get_lock_context(dreq->ctx);
|