summaryrefslogtreecommitdiffstats
path: root/fs/nfsd
diff options
context:
space:
mode:
authorJ. Bruce Fields <bfields@redhat.com>2013-10-30 10:33:09 -0400
committerJ. Bruce Fields <bfields@redhat.com>2013-10-30 10:35:59 -0400
commite50a26dc785f12a6df1f1ac16d62faf0342b72af (patch)
tree72b2520bd8e298cbd789522e370dea5d30a59180 /fs/nfsd
parente1a90ebd8b2349eb00ec22f0b8bf6ab8bbd06cc8 (diff)
nfsd4: nfsd_shutdown_net needs state lock
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>
Diffstat (limited to 'fs/nfsd')
-rw-r--r--fs/nfsd/nfs4state.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 21eb6788cb33..e03e8efff53f 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -5124,7 +5124,6 @@ out_recovery:
5124 return ret; 5124 return ret;
5125} 5125}
5126 5126
5127/* should be called with the state lock held */
5128void 5127void
5129nfs4_state_shutdown_net(struct net *net) 5128nfs4_state_shutdown_net(struct net *net)
5130{ 5129{
@@ -5135,6 +5134,7 @@ nfs4_state_shutdown_net(struct net *net)
5135 cancel_delayed_work_sync(&nn->laundromat_work); 5134 cancel_delayed_work_sync(&nn->laundromat_work);
5136 locks_end_grace(&nn->nfsd4_manager); 5135 locks_end_grace(&nn->nfsd4_manager);
5137 5136
5137 nfs4_lock_state();
5138 INIT_LIST_HEAD(&reaplist); 5138 INIT_LIST_HEAD(&reaplist);
5139 spin_lock(&recall_lock); 5139 spin_lock(&recall_lock);
5140 list_for_each_safe(pos, next, &nn->del_recall_lru) { 5140 list_for_each_safe(pos, next, &nn->del_recall_lru) {
@@ -5149,6 +5149,7 @@ nfs4_state_shutdown_net(struct net *net)
5149 5149
5150 nfsd4_client_tracking_exit(net); 5150 nfsd4_client_tracking_exit(net);
5151 nfs4_state_destroy_net(net); 5151 nfs4_state_destroy_net(net);
5152 nfs4_unlock_state();
5152} 5153}
5153 5154
5154void 5155void