@@ -336,10 +336,8 @@ nfs_start_delegation_return(struct nfs_inode *nfsi)
336336
337337 spin_lock (& delegation -> lock );
338338 if (delegation -> inode &&
339- !test_and_set_bit (NFS_DELEGATION_RETURNING , & delegation -> flags )) {
340- clear_bit (NFS_DELEGATION_RETURN_DELAYED , & delegation -> flags );
339+ !test_and_set_bit (NFS_DELEGATION_RETURNING , & delegation -> flags ))
341340 return_now = true;
342- }
343341 spin_unlock (& delegation -> lock );
344342
345343 if (!return_now ) {
@@ -586,8 +584,11 @@ static int nfs_end_delegation_return(struct inode *inode,
586584out_return :
587585 return nfs_do_return_delegation (inode , delegation , issync );
588586delay :
589- set_bit (NFS_DELEGATION_RETURN_DELAYED , & delegation -> flags );
590- set_bit (NFS4SERV_DELEGRETURN_DELAYED , & server -> delegation_flags );
587+ spin_lock (& server -> delegations_lock );
588+ if (list_empty (& delegation -> entry ))
589+ refcount_inc (& delegation -> refcount );
590+ list_move_tail (& delegation -> entry , & server -> delegations_return );
591+ spin_unlock (& server -> delegations_lock );
591592 set_bit (NFS4CLNT_DELEGRETURN_DELAYED , & server -> nfs_client -> cl_state );
592593abort :
593594 clear_bit (NFS_DELEGATION_RETURNING , & delegation -> flags );
@@ -616,22 +617,16 @@ static int nfs_return_one_delegation(struct nfs_server *server)
616617 spin_unlock (& delegation -> lock );
617618 goto out_put_delegation ;
618619 }
619- if (test_bit (NFS_DELEGATION_RETURN_DELAYED , & delegation -> flags ) ||
620- test_bit (NFS_DELEGATION_REVOKED , & delegation -> flags ) ||
620+ if (test_bit (NFS_DELEGATION_REVOKED , & delegation -> flags ) ||
621621 test_and_set_bit (NFS_DELEGATION_RETURNING , & delegation -> flags )) {
622622 spin_unlock (& delegation -> lock );
623623 goto out_put_inode ;
624624 }
625- clear_bit (NFS_DELEGATION_RETURN_DELAYED , & delegation -> flags );
626625 spin_unlock (& delegation -> lock );
627626
628627 nfs_clear_verifier_delegated (inode );
629628
630629 err = nfs_end_delegation_return (inode , delegation , false);
631- if (err ) {
632- nfs_mark_return_delegation (server , delegation );
633- goto out_put_inode ;
634- }
635630
636631out_put_inode :
637632 iput (inode );
@@ -708,19 +703,18 @@ static void nfs_delegation_add_lru(struct nfs_server *server,
708703
709704static bool nfs_server_clear_delayed_delegations (struct nfs_server * server )
710705{
711- struct nfs_delegation * d ;
712706 bool ret = false;
713707
714- if (!test_and_clear_bit (NFS4SERV_DELEGRETURN_DELAYED ,
715- & server -> delegation_flags ))
708+ if (list_empty_careful (& server -> delegations_delayed ))
716709 return false;
717710
718711 spin_lock (& server -> delegations_lock );
719- list_for_each_entry_rcu ( d , & server -> delegations_return , entry ) {
720- if ( test_bit ( NFS_DELEGATION_RETURN_DELAYED , & d -> flags ))
721- clear_bit ( NFS_DELEGATION_RETURN_DELAYED , & d -> flags );
712+ if (! list_empty ( & server -> delegations_delayed ) ) {
713+ list_splice_tail_init ( & server -> delegations_delayed ,
714+ & server -> delegations_return );
722715 ret = true;
723716 }
717+ spin_unlock (& server -> delegations_lock );
724718
725719 return ret ;
726720}
0 commit comments