aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ. Bruce Fields <bfields@citi.umich.edu>2007-11-22 13:54:18 -0500
committerJ. Bruce Fields <bfields@citi.umich.edu>2008-02-01 16:42:01 -0500
commit46f8a64bae11f5c9b15b4401f6e9863281999b66 (patch)
treeaea712834e9a12a43772de61c1f6af0dc2ea1b57
parent24e1c13c93cbdd05e4b7ea921c0050b036555adc (diff)
nfsd4: probe callback channel only once
Our callback code doesn't actually handle concurrent attempts to probe the callback channel. Some rethinking of the locking may be required. However, we can also just move the callback probing to this case. Since this is the only time a client is "confirmed" (and since that can only happen once in the lifetime of a client), this ensures we only probe once. Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
-rw-r--r--fs/nfsd/nfs4callback.c3
-rw-r--r--fs/nfsd/nfs4state.c3
2 files changed, 2 insertions, 4 deletions
diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c
index 9d536a8cb379..a9735a672963 100644
--- a/fs/nfsd/nfs4callback.c
+++ b/fs/nfsd/nfs4callback.c
@@ -395,8 +395,7 @@ nfsd4_probe_callback(struct nfs4_client *clp)
395 }; 395 };
396 struct task_struct *t; 396 struct task_struct *t;
397 397
398 if (atomic_read(&cb->cb_set)) 398 BUG_ON(atomic_read(&clp->cl_callback.cb_set));
399 return;
400 399
401 /* Initialize address */ 400 /* Initialize address */
402 memset(&addr, 0, sizeof(addr)); 401 memset(&addr, 0, sizeof(addr));
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 31673cd251c3..9d81c7117ae6 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -948,6 +948,7 @@ nfsd4_setclientid_confirm(struct svc_rqst *rqstp,
948 } 948 }
949 move_to_confirmed(unconf); 949 move_to_confirmed(unconf);
950 conf = unconf; 950 conf = unconf;
951 nfsd4_probe_callback(conf);
951 status = nfs_ok; 952 status = nfs_ok;
952 } 953 }
953 } else if ((!conf || (conf && !same_verf(&conf->cl_confirm, &confirm))) 954 } else if ((!conf || (conf && !same_verf(&conf->cl_confirm, &confirm)))
@@ -965,8 +966,6 @@ nfsd4_setclientid_confirm(struct svc_rqst *rqstp,
965 status = nfserr_clid_inuse; 966 status = nfserr_clid_inuse;
966 } 967 }
967out: 968out:
968 if (!status)
969 nfsd4_probe_callback(conf);
970 nfs4_unlock_state(); 969 nfs4_unlock_state();
971 return status; 970 return status;
972} 971}