[nfsv4] [nfsv4] server-cluster-locking-api: cthon failure

J. Bruce Fields bfields at fieldses.org
Tue Jul 4 17:55:50 EDT 2006


On Tue, Jul 04, 2006 at 02:45:51PM -0700, Bryce Harrington wrote:
> Would it be helpful if I set up a couple boxes with this kernel that
> reproduce the error, that you can log in and poke around on?  Or is
> there a way I can gather the necessary info for you?

It might, if I could also get instructions on how to rebuild and
reinstall the same kernel on those machines.  I'm not sure if I'll be
able to get to it soon enough, though....

I think the first thing to try is to get a network trace showing the
failure.

Then I think what I'd want to do next is run with something like this
(untested) and watch the logs to see which case it's hitting.

--b.

diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 6330f02..bbecaf3 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -899,10 +899,14 @@ nfsd4_setclientid_confirm(struct svc_rqs
 	unconf = find_unconfirmed_client(clid);
 
 	status = nfserr_clid_inuse;
-	if (conf && conf->cl_addr != ip_addr)
+	if (conf && conf->cl_addr != ip_addr) {
+		printk("clid_inuse: bad conf ip\n");
 		goto out;
-	if (unconf && unconf->cl_addr != ip_addr)
+	}
+	if (unconf && unconf->cl_addr != ip_addr) {
+		printk("clid_inuse_ bad unconf ip\n");
 		goto out;
+	}
 
 	if ((conf && unconf) && 
 	    (cmp_verf(&unconf->cl_confirm, &confirm)) &&
@@ -914,9 +918,10 @@ nfsd4_setclientid_confirm(struct svc_rqs
 		* conf record that matches input clientid.
 		* conf and unconf records match names, verifiers
 		*/
-		if (!cmp_creds(&conf->cl_cred, &unconf->cl_cred)) 
+		if (!cmp_creds(&conf->cl_cred, &unconf->cl_cred)) {
+			printk("clid_inuse: case 1\n");
 			status = nfserr_clid_inuse;
-		else {
+		} else {
 			/* XXX: We just turn off callbacks until we can handle
 			  * change request correctly. */
 			atomic_set(&conf->cl_callback.cb_set, 0);
@@ -936,9 +941,10 @@ nfsd4_setclientid_confirm(struct svc_rqs
 		 * unconf->cl_name or unconf->cl_verifier don't match the
 		 * conf record.
 		 */
-		if (!cmp_creds(&conf->cl_cred,&rqstp->rq_cred))
+		if (!cmp_creds(&conf->cl_cred,&rqstp->rq_cred)) {
+			printk("clid_inuse: case 2\n");
 			status = nfserr_clid_inuse;
-		else
+		} else
 			status = nfs_ok;
 	} else if (!conf && unconf
 			&& cmp_verf(&unconf->cl_confirm, &confirm)) {
@@ -948,6 +954,7 @@ nfsd4_setclientid_confirm(struct svc_rqs
 		 * unconf->cl_confirm matches input confirm
 		 */
 		if (!cmp_creds(&unconf->cl_cred, &rqstp->rq_cred)) {
+			printk("clid_inuse: case 3\n");
 			status = nfserr_clid_inuse;
 		} else {
 			unsigned int hash =
@@ -974,6 +981,7 @@ nfsd4_setclientid_confirm(struct svc_rqs
 		status = nfserr_stale_clientid;
 	} else {
 		/* check that we have hit one of the cases...*/
+		printk("clid_inuse: mystery case!\n");
 		status = nfserr_clid_inuse;
 	}
 out:


More information about the NFSv4 mailing list