@@ -196,6 +196,12 @@ static void nfs_direct_set_hdr_verf(struct nfs_direct_req *dreq,
196196 WARN_ON_ONCE (verfp -> committed < 0 );
197197}
198198
199+ static int nfs_direct_cmp_verf (const struct nfs_writeverf * v1 ,
200+ const struct nfs_writeverf * v2 )
201+ {
202+ return nfs_write_verifier_cmp (& v1 -> verifier , & v2 -> verifier );
203+ }
204+
199205/*
200206 * nfs_direct_cmp_hdr_verf - compare verifier for pgio header
201207 * @dreq - direct request possibly spanning multiple servers
@@ -215,7 +221,7 @@ static int nfs_direct_set_or_cmp_hdr_verf(struct nfs_direct_req *dreq,
215221 nfs_direct_set_hdr_verf (dreq , hdr );
216222 return 0 ;
217223 }
218- return memcmp (verfp , & hdr -> verf , sizeof ( struct nfs_writeverf ) );
224+ return nfs_direct_cmp_verf (verfp , & hdr -> verf );
219225}
220226
221227/*
@@ -238,7 +244,7 @@ static int nfs_direct_cmp_commit_data_verf(struct nfs_direct_req *dreq,
238244 if (verfp -> committed < 0 )
239245 return 1 ;
240246
241- return memcmp (verfp , & data -> verf , sizeof ( struct nfs_writeverf ) );
247+ return nfs_direct_cmp_verf (verfp , & data -> verf );
242248}
243249
244250/**
@@ -368,22 +374,10 @@ static ssize_t nfs_direct_wait(struct nfs_direct_req *dreq)
368374 * Synchronous I/O uses a stack-allocated iocb. Thus we can't trust
369375 * the iocb is still valid here if this is a synchronous request.
370376 */
371- static void nfs_direct_complete (struct nfs_direct_req * dreq , bool write )
377+ static void nfs_direct_complete (struct nfs_direct_req * dreq )
372378{
373379 struct inode * inode = dreq -> inode ;
374380
375- if (dreq -> iocb && write ) {
376- loff_t pos = dreq -> iocb -> ki_pos + dreq -> count ;
377-
378- spin_lock (& inode -> i_lock );
379- if (i_size_read (inode ) < pos )
380- i_size_write (inode , pos );
381- spin_unlock (& inode -> i_lock );
382- }
383-
384- if (write )
385- nfs_zap_mapping (inode , inode -> i_mapping );
386-
387381 inode_dio_end (inode );
388382
389383 if (dreq -> iocb ) {
@@ -438,7 +432,7 @@ static void nfs_direct_read_completion(struct nfs_pgio_header *hdr)
438432 }
439433out_put :
440434 if (put_dreq (dreq ))
441- nfs_direct_complete (dreq , false );
435+ nfs_direct_complete (dreq );
442436 hdr -> release (hdr );
443437}
444438
@@ -544,7 +538,7 @@ static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq,
544538 }
545539
546540 if (put_dreq (dreq ))
547- nfs_direct_complete (dreq , false );
541+ nfs_direct_complete (dreq );
548542 return 0 ;
549543}
550544
@@ -585,17 +579,12 @@ ssize_t nfs_file_direct_read(struct kiocb *iocb, struct iov_iter *iter)
585579 if (!count )
586580 goto out ;
587581
588- inode_lock (inode );
589- result = nfs_sync_mapping (mapping );
590- if (result )
591- goto out_unlock ;
592-
593582 task_io_account_read (count );
594583
595584 result = - ENOMEM ;
596585 dreq = nfs_direct_req_alloc ();
597586 if (dreq == NULL )
598- goto out_unlock ;
587+ goto out ;
599588
600589 dreq -> inode = inode ;
601590 dreq -> bytes_left = dreq -> max_count = count ;
@@ -610,24 +599,21 @@ ssize_t nfs_file_direct_read(struct kiocb *iocb, struct iov_iter *iter)
610599 if (!is_sync_kiocb (iocb ))
611600 dreq -> iocb = iocb ;
612601
602+ nfs_start_io_direct (inode );
603+
613604 NFS_I (inode )-> read_io += count ;
614605 result = nfs_direct_read_schedule_iovec (dreq , iter , iocb -> ki_pos );
615606
616- inode_unlock (inode );
607+ nfs_end_io_direct (inode );
617608
618609 if (!result ) {
619610 result = nfs_direct_wait (dreq );
620611 if (result > 0 )
621612 iocb -> ki_pos += result ;
622613 }
623614
624- nfs_direct_req_release (dreq );
625- return result ;
626-
627615out_release :
628616 nfs_direct_req_release (dreq );
629- out_unlock :
630- inode_unlock (inode );
631617out :
632618 return result ;
633619}
@@ -659,6 +645,8 @@ static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq)
659645 nfs_direct_write_scan_commit_list (dreq -> inode , & reqs , & cinfo );
660646
661647 dreq -> count = 0 ;
648+ dreq -> verf .committed = NFS_INVALID_STABLE_HOW ;
649+ nfs_clear_pnfs_ds_commit_verifiers (& dreq -> ds_cinfo );
662650 for (i = 0 ; i < dreq -> mirror_count ; i ++ )
663651 dreq -> mirrors [i ].count = 0 ;
664652 get_dreq (dreq );
@@ -777,7 +765,8 @@ static void nfs_direct_write_schedule_work(struct work_struct *work)
777765 nfs_direct_write_reschedule (dreq );
778766 break ;
779767 default :
780- nfs_direct_complete (dreq , true);
768+ nfs_zap_mapping (dreq -> inode , dreq -> inode -> i_mapping );
769+ nfs_direct_complete (dreq );
781770 }
782771}
783772
@@ -993,6 +982,7 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,
993982ssize_t nfs_file_direct_write (struct kiocb * iocb , struct iov_iter * iter )
994983{
995984 ssize_t result = - EINVAL ;
985+ size_t count ;
996986 struct file * file = iocb -> ki_filp ;
997987 struct address_space * mapping = file -> f_mapping ;
998988 struct inode * inode = mapping -> host ;
@@ -1003,34 +993,24 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter)
1003993 dfprintk (FILE , "NFS: direct write(%pD2, %zd@%Ld)\n" ,
1004994 file , iov_iter_count (iter ), (long long ) iocb -> ki_pos );
1005995
1006- nfs_add_stats (mapping -> host , NFSIOS_DIRECTWRITTENBYTES ,
1007- iov_iter_count (iter ));
996+ result = generic_write_checks (iocb , iter );
997+ if (result <= 0 )
998+ return result ;
999+ count = result ;
1000+ nfs_add_stats (mapping -> host , NFSIOS_DIRECTWRITTENBYTES , count );
10081001
10091002 pos = iocb -> ki_pos ;
10101003 end = (pos + iov_iter_count (iter ) - 1 ) >> PAGE_SHIFT ;
10111004
1012- inode_lock (inode );
1013-
1014- result = nfs_sync_mapping (mapping );
1015- if (result )
1016- goto out_unlock ;
1017-
1018- if (mapping -> nrpages ) {
1019- result = invalidate_inode_pages2_range (mapping ,
1020- pos >> PAGE_SHIFT , end );
1021- if (result )
1022- goto out_unlock ;
1023- }
1024-
1025- task_io_account_write (iov_iter_count (iter ));
1005+ task_io_account_write (count );
10261006
10271007 result = - ENOMEM ;
10281008 dreq = nfs_direct_req_alloc ();
10291009 if (!dreq )
1030- goto out_unlock ;
1010+ goto out ;
10311011
10321012 dreq -> inode = inode ;
1033- dreq -> bytes_left = dreq -> max_count = iov_iter_count ( iter ) ;
1013+ dreq -> bytes_left = dreq -> max_count = count ;
10341014 dreq -> io_start = pos ;
10351015 dreq -> ctx = get_nfs_open_context (nfs_file_open_context (iocb -> ki_filp ));
10361016 l_ctx = nfs_get_lock_context (dreq -> ctx );
@@ -1042,37 +1022,28 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter)
10421022 if (!is_sync_kiocb (iocb ))
10431023 dreq -> iocb = iocb ;
10441024
1025+ nfs_start_io_direct (inode );
1026+
10451027 result = nfs_direct_write_schedule_iovec (dreq , iter , pos );
10461028
10471029 if (mapping -> nrpages ) {
10481030 invalidate_inode_pages2_range (mapping ,
10491031 pos >> PAGE_SHIFT , end );
10501032 }
10511033
1052- inode_unlock (inode );
1034+ nfs_end_io_direct (inode );
10531035
10541036 if (!result ) {
10551037 result = nfs_direct_wait (dreq );
10561038 if (result > 0 ) {
1057- struct inode * inode = mapping -> host ;
1058-
10591039 iocb -> ki_pos = pos + result ;
1060- spin_lock (& inode -> i_lock );
1061- if (i_size_read (inode ) < iocb -> ki_pos )
1062- i_size_write (inode , iocb -> ki_pos );
1063- spin_unlock (& inode -> i_lock );
1064-
10651040 /* XXX: should check the generic_write_sync retval */
10661041 generic_write_sync (iocb , result );
10671042 }
10681043 }
1069- nfs_direct_req_release (dreq );
1070- return result ;
1071-
10721044out_release :
10731045 nfs_direct_req_release (dreq );
1074- out_unlock :
1075- inode_unlock (inode );
1046+ out :
10761047 return result ;
10771048}
10781049
0 commit comments