nfsd4: nfsd_shutdown_net needs state lock
authorJ. Bruce Fields <bfields@redhat.com>
Wed, 30 Oct 2013 14:33:09 +0000 (10:33 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Wed, 30 Oct 2013 14:35:59 +0000 (10:35 -0400)
A comment claims the caller should take it, but that's not being done.
Note we don't want it around the cancel_delayed_work_sync since that may
wait on work which holds the client lock.

Reported-by: Benny Halevy <bhalevy@primarydata.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs4state.c

index 21eb6788cb33f2bd909a776e256e9cf743a0a4e1..e03e8efff53f8877284625ce274d486bd690f02a 100644 (file)
@@ -5124,7 +5124,6 @@ out_recovery:
        return ret;
 }
 
-/* should be called with the state lock held */
 void
 nfs4_state_shutdown_net(struct net *net)
 {
@@ -5135,6 +5134,7 @@ nfs4_state_shutdown_net(struct net *net)
        cancel_delayed_work_sync(&nn->laundromat_work);
        locks_end_grace(&nn->nfsd4_manager);
 
+       nfs4_lock_state();
        INIT_LIST_HEAD(&reaplist);
        spin_lock(&recall_lock);
        list_for_each_safe(pos, next, &nn->del_recall_lru) {
@@ -5149,6 +5149,7 @@ nfs4_state_shutdown_net(struct net *net)
 
        nfsd4_client_tracking_exit(net);
        nfs4_state_destroy_net(net);
+       nfs4_unlock_state();
 }
 
 void