@@ -988,6 +988,7 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,
988
988
ssize_t nfs_file_direct_write (struct kiocb * iocb , struct iov_iter * iter )
989
989
{
990
990
ssize_t result = - EINVAL ;
991
+ size_t count ;
991
992
struct file * file = iocb -> ki_filp ;
992
993
struct address_space * mapping = file -> f_mapping ;
993
994
struct inode * inode = mapping -> host ;
@@ -998,8 +999,11 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter)
998
999
dfprintk (FILE , "NFS: direct write(%pD2, %zd@%Ld)\n" ,
999
1000
file , iov_iter_count (iter ), (long long ) iocb -> ki_pos );
1000
1001
1001
- nfs_add_stats (mapping -> host , NFSIOS_DIRECTWRITTENBYTES ,
1002
- iov_iter_count (iter ));
1002
+ result = generic_write_checks (iocb , iter );
1003
+ if (result <= 0 )
1004
+ return result ;
1005
+ count = result ;
1006
+ nfs_add_stats (mapping -> host , NFSIOS_DIRECTWRITTENBYTES , count );
1003
1007
1004
1008
pos = iocb -> ki_pos ;
1005
1009
end = (pos + iov_iter_count (iter ) - 1 ) >> PAGE_SHIFT ;
@@ -1017,15 +1021,15 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter)
1017
1021
goto out_unlock ;
1018
1022
}
1019
1023
1020
- task_io_account_write (iov_iter_count ( iter ) );
1024
+ task_io_account_write (count );
1021
1025
1022
1026
result = - ENOMEM ;
1023
1027
dreq = nfs_direct_req_alloc ();
1024
1028
if (!dreq )
1025
1029
goto out_unlock ;
1026
1030
1027
1031
dreq -> inode = inode ;
1028
- dreq -> bytes_left = dreq -> max_count = iov_iter_count ( iter ) ;
1032
+ dreq -> bytes_left = dreq -> max_count = count ;
1029
1033
dreq -> io_start = pos ;
1030
1034
dreq -> ctx = get_nfs_open_context (nfs_file_open_context (iocb -> ki_filp ));
1031
1035
l_ctx = nfs_get_lock_context (dreq -> ctx );
0 commit comments