summaryrefslogtreecommitdiffstats
path: root/fs/nfsd
diff options
context:
space:
mode:
authorNeilBrown <neilb@cse.unsw.edu.au>2005-06-23 22:04:08 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-06-24 00:06:34 -0700
commit1a69c179a28a9bb9f4d086927b192d5cffe88e50 (patch)
treee2155b4eb77f6d98f8643238b2836065abe1a836 /fs/nfsd
parent31f4a6c127f619886bf97f643e546f7788248f3f (diff)
downloadlinux-stable-1a69c179a28a9bb9f4d086927b192d5cffe88e50.tar.gz
linux-stable-1a69c179a28a9bb9f4d086927b192d5cffe88e50.tar.bz2
linux-stable-1a69c179a28a9bb9f4d086927b192d5cffe88e50.zip
[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: 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>
Diffstat (limited to 'fs/nfsd')
-rw-r--r--fs/nfsd/nfs4state.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 67a038dc0d0e..997343c23043 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -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;
}