Skip to content

Commit

Permalink
[PATCH] knfsd: nfsd4: fix setclientid_confirm cases
Browse files Browse the repository at this point in the history
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: J. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
NeilBrown authored and Linus Torvalds committed Jun 24, 2005
1 parent 31f4a6c commit 1a69c17
Showing 1 changed file with 15 additions and 4 deletions.
19 changes: 15 additions & 4 deletions fs/nfsd/nfs4state.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}
Expand Down

0 comments on commit 1a69c17

Please sign in to comment.