@@ -273,7 +273,7 @@ nfs_local_iocb_free(struct nfs_local_kiocb *iocb)
273
273
274
274
static struct nfs_local_kiocb *
275
275
nfs_local_iocb_alloc (struct nfs_pgio_header * hdr ,
276
- struct nfsd_file * localio , gfp_t flags )
276
+ struct file * file , gfp_t flags )
277
277
{
278
278
struct nfs_local_kiocb * iocb ;
279
279
@@ -286,9 +286,8 @@ nfs_local_iocb_alloc(struct nfs_pgio_header *hdr,
286
286
kfree (iocb );
287
287
return NULL ;
288
288
}
289
- init_sync_kiocb (& iocb -> kiocb , nfs_to -> nfsd_file_file ( localio ) );
289
+ init_sync_kiocb (& iocb -> kiocb , file );
290
290
iocb -> kiocb .ki_pos = hdr -> args .offset ;
291
- iocb -> localio = localio ;
292
291
iocb -> hdr = hdr ;
293
292
iocb -> kiocb .ki_flags &= ~IOCB_APPEND ;
294
293
return iocb ;
@@ -389,13 +388,19 @@ nfs_do_local_read(struct nfs_pgio_header *hdr,
389
388
const struct rpc_call_ops * call_ops )
390
389
{
391
390
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 ;
392
396
393
397
dprintk ("%s: vfs_read count=%u pos=%llu\n" ,
394
398
__func__ , hdr -> args .count , hdr -> args .offset );
395
399
396
- iocb = nfs_local_iocb_alloc (hdr , localio , GFP_KERNEL );
400
+ iocb = nfs_local_iocb_alloc (hdr , file , GFP_KERNEL );
397
401
if (iocb == NULL )
398
402
return - ENOMEM ;
403
+ iocb -> localio = localio ;
399
404
400
405
nfs_local_pgio_init (hdr , call_ops );
401
406
hdr -> res .eof = false;
@@ -558,14 +563,20 @@ nfs_do_local_write(struct nfs_pgio_header *hdr,
558
563
const struct rpc_call_ops * call_ops )
559
564
{
560
565
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 ;
561
571
562
572
dprintk ("%s: vfs_write count=%u pos=%llu %s\n" ,
563
573
__func__ , hdr -> args .count , hdr -> args .offset ,
564
574
(hdr -> args .stable == NFS_UNSTABLE ) ? "unstable" : "stable" );
565
575
566
- iocb = nfs_local_iocb_alloc (hdr , localio , GFP_NOIO );
576
+ iocb = nfs_local_iocb_alloc (hdr , file , GFP_NOIO );
567
577
if (iocb == NULL )
568
578
return - ENOMEM ;
579
+ iocb -> localio = localio ;
569
580
570
581
switch (hdr -> args .stable ) {
571
582
default :
@@ -591,16 +602,9 @@ int nfs_local_doio(struct nfs_client *clp, struct nfsd_file *localio,
591
602
const struct rpc_call_ops * call_ops )
592
603
{
593
604
int status = 0 ;
594
- struct file * filp = nfs_to -> nfsd_file_file (localio );
595
605
596
606
if (!hdr -> args .count )
597
607
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
- }
604
608
605
609
switch (hdr -> rw_mode ) {
606
610
case FMODE_READ :
@@ -614,8 +618,10 @@ int nfs_local_doio(struct nfs_client *clp, struct nfsd_file *localio,
614
618
hdr -> rw_mode );
615
619
status = - EINVAL ;
616
620
}
617
- out :
621
+
618
622
if (status != 0 ) {
623
+ if (status == - EAGAIN )
624
+ nfs_local_disable (clp );
619
625
nfs_to_nfsd_file_put_local (localio );
620
626
hdr -> task .tk_status = status ;
621
627
nfs_local_hdr_release (hdr , call_ops );
0 commit comments