Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1a69c179 authored by NeilBrown's avatar NeilBrown Committed by Linus Torvalds
Browse files

[PATCH] knfsd: nfsd4: fix setclientid_confirm cases



Setclientid_confirm code confused states 1 and 3 (numbering from the
IMPLEMENTATION section of rfc3530, section 14.2.33).  Fix this.

State 1 allows the client to change the callback channel on the fly.  We don't
implement this currently, so just turn off the callback channel in this case.

From: Fred Isaman
Signed-off-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: default avatarNeil Brown <neilb@cse.unsw.edu.au>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 31f4a6c1
Loading
Loading
Loading
Loading
+15 −4
Original line number Diff line number Diff line
@@ -887,10 +887,14 @@ nfsd4_setclientid_confirm(struct svc_rqst *rqstp, struct nfsd4_setclientid_confi
		if (!cmp_creds(&conf->cl_cred, &unconf->cl_cred)) 
			status = nfserr_clid_inuse;
		else {
			expire_client(conf);
			clp = unconf;
			move_to_confirmed(unconf);
			/* XXX: We just turn off callbacks until we can handle
			  * change request correctly. */
			clp = conf;
			clp->cl_callback.cb_parsed = 0;
			gen_confirm(clp);
			expire_client(unconf);
			status = nfs_ok;

		}
		goto out;
	} 
@@ -920,9 +924,16 @@ nfsd4_setclientid_confirm(struct svc_rqst *rqstp, struct nfsd4_setclientid_confi
		if (!cmp_creds(&unconf->cl_cred, &rqstp->rq_cred)) {
			status = nfserr_clid_inuse;
		} else {
			status = nfs_ok;
			unsigned int hash =
				clientstr_hashval(unconf->cl_recdir);
			conf = find_confirmed_client_by_str(unconf->cl_recdir,
									hash);
			if (conf) {
				expire_client(conf);
			}
			clp = unconf;
			move_to_confirmed(unconf);
			status = nfs_ok;
		}
		goto out;
	}