@@ -273,7 +273,7 @@ nfs_local_iocb_free(struct nfs_local_kiocb *iocb)
273273
274274static struct nfs_local_kiocb *
275275nfs_local_iocb_alloc (struct nfs_pgio_header * hdr ,
276- struct nfsd_file * localio , gfp_t flags )
276+ struct file * file , gfp_t flags )
277277{
278278 struct nfs_local_kiocb * iocb ;
279279
@@ -286,9 +286,8 @@ nfs_local_iocb_alloc(struct nfs_pgio_header *hdr,
286286 kfree (iocb );
287287 return NULL ;
288288 }
289- init_sync_kiocb (& iocb -> kiocb , nfs_to -> nfsd_file_file ( localio ) );
289+ init_sync_kiocb (& iocb -> kiocb , file );
290290 iocb -> kiocb .ki_pos = hdr -> args .offset ;
291- iocb -> localio = localio ;
292291 iocb -> hdr = hdr ;
293292 iocb -> kiocb .ki_flags &= ~IOCB_APPEND ;
294293 return iocb ;
@@ -389,13 +388,19 @@ nfs_do_local_read(struct nfs_pgio_header *hdr,
389388 const struct rpc_call_ops * call_ops )
390389{
391390 struct nfs_local_kiocb * iocb ;
391+ struct file * file = nfs_to -> nfsd_file_file (localio );
392+
393+ /* Don't support filesystems without read_iter */
394+ if (!file -> f_op -> read_iter )
395+ return - EAGAIN ;
392396
393397 dprintk ("%s: vfs_read count=%u pos=%llu\n" ,
394398 __func__ , hdr -> args .count , hdr -> args .offset );
395399
396- iocb = nfs_local_iocb_alloc (hdr , localio , GFP_KERNEL );
400+ iocb = nfs_local_iocb_alloc (hdr , file , GFP_KERNEL );
397401 if (iocb == NULL )
398402 return - ENOMEM ;
403+ iocb -> localio = localio ;
399404
400405 nfs_local_pgio_init (hdr , call_ops );
401406 hdr -> res .eof = false;
@@ -558,14 +563,20 @@ nfs_do_local_write(struct nfs_pgio_header *hdr,
558563 const struct rpc_call_ops * call_ops )
559564{
560565 struct nfs_local_kiocb * iocb ;
566+ struct file * file = nfs_to -> nfsd_file_file (localio );
567+
568+ /* Don't support filesystems without write_iter */
569+ if (!file -> f_op -> write_iter )
570+ return - EAGAIN ;
561571
562572 dprintk ("%s: vfs_write count=%u pos=%llu %s\n" ,
563573 __func__ , hdr -> args .count , hdr -> args .offset ,
564574 (hdr -> args .stable == NFS_UNSTABLE ) ? "unstable" : "stable" );
565575
566- iocb = nfs_local_iocb_alloc (hdr , localio , GFP_NOIO );
576+ iocb = nfs_local_iocb_alloc (hdr , file , GFP_NOIO );
567577 if (iocb == NULL )
568578 return - ENOMEM ;
579+ iocb -> localio = localio ;
569580
570581 switch (hdr -> args .stable ) {
571582 default :
@@ -591,16 +602,9 @@ int nfs_local_doio(struct nfs_client *clp, struct nfsd_file *localio,
591602 const struct rpc_call_ops * call_ops )
592603{
593604 int status = 0 ;
594- struct file * filp = nfs_to -> nfsd_file_file (localio );
595605
596606 if (!hdr -> args .count )
597607 return 0 ;
598- /* Don't support filesystems without read_iter/write_iter */
599- if (!filp -> f_op -> read_iter || !filp -> f_op -> write_iter ) {
600- nfs_local_disable (clp );
601- status = - EAGAIN ;
602- goto out ;
603- }
604608
605609 switch (hdr -> rw_mode ) {
606610 case FMODE_READ :
@@ -614,8 +618,10 @@ int nfs_local_doio(struct nfs_client *clp, struct nfsd_file *localio,
614618 hdr -> rw_mode );
615619 status = - EINVAL ;
616620 }
617- out :
621+
618622 if (status != 0 ) {
623+ if (status == - EAGAIN )
624+ nfs_local_disable (clp );
619625 nfs_to_nfsd_file_put_local (localio );
620626 hdr -> task .tk_status = status ;
621627 nfs_local_hdr_release (hdr , call_ops );
0 commit comments