|
@@ -834,7 +834,7 @@ int
|
|
|
nfsd4_setclientid_confirm(struct svc_rqst *rqstp, struct nfsd4_setclientid_confirm *setclientid_confirm)
|
|
|
{
|
|
|
u32 ip_addr = rqstp->rq_addr.sin_addr.s_addr;
|
|
|
- struct nfs4_client *clp, *conf = NULL, *unconf = NULL;
|
|
|
+ struct nfs4_client *conf, *unconf;
|
|
|
nfs4_verifier confirm = setclientid_confirm->sc_confirm;
|
|
|
clientid_t * clid = &setclientid_confirm->sc_clientid;
|
|
|
int status;
|
|
@@ -847,28 +847,16 @@ nfsd4_setclientid_confirm(struct svc_rqst *rqstp, struct nfsd4_setclientid_confi
|
|
|
*/
|
|
|
|
|
|
nfs4_lock_state();
|
|
|
- clp = find_confirmed_client(clid);
|
|
|
- if (clp) {
|
|
|
- status = nfserr_clid_inuse;
|
|
|
- if (clp->cl_addr != ip_addr) {
|
|
|
- printk("NFSD: setclientid: string in use by client"
|
|
|
- "(clientid %08x/%08x)\n",
|
|
|
- clp->cl_clientid.cl_boot, clp->cl_clientid.cl_id);
|
|
|
- goto out;
|
|
|
- }
|
|
|
- conf = clp;
|
|
|
- }
|
|
|
- clp = find_unconfirmed_client(clid);
|
|
|
- if (clp) {
|
|
|
- status = nfserr_clid_inuse;
|
|
|
- if (clp->cl_addr != ip_addr) {
|
|
|
- printk("NFSD: setclientid: string in use by client"
|
|
|
- "(clientid %08x/%08x)\n",
|
|
|
- clp->cl_clientid.cl_boot, clp->cl_clientid.cl_id);
|
|
|
- goto out;
|
|
|
- }
|
|
|
- unconf = clp;
|
|
|
- }
|
|
|
+
|
|
|
+ conf = find_confirmed_client(clid);
|
|
|
+ unconf = find_unconfirmed_client(clid);
|
|
|
+
|
|
|
+ status = nfserr_clid_inuse;
|
|
|
+ if (conf && conf->cl_addr != ip_addr)
|
|
|
+ goto out;
|
|
|
+ if (unconf && unconf->cl_addr != ip_addr)
|
|
|
+ goto out;
|
|
|
+
|
|
|
if ((conf && unconf) &&
|
|
|
(cmp_verf(&unconf->cl_confirm, &confirm)) &&
|
|
|
(cmp_verf(&conf->cl_verifier, &unconf->cl_verifier)) &&
|
|
@@ -884,9 +872,8 @@ nfsd4_setclientid_confirm(struct svc_rqst *rqstp, struct nfsd4_setclientid_confi
|
|
|
else {
|
|
|
/* XXX: We just turn off callbacks until we can handle
|
|
|
* change request correctly. */
|
|
|
- clp = conf;
|
|
|
- clp->cl_callback.cb_parsed = 0;
|
|
|
- gen_confirm(clp);
|
|
|
+ conf->cl_callback.cb_parsed = 0;
|
|
|
+ gen_confirm(conf);
|
|
|
expire_client(unconf);
|
|
|
status = nfs_ok;
|
|
|
|
|
@@ -901,12 +888,10 @@ nfsd4_setclientid_confirm(struct svc_rqst *rqstp, struct nfsd4_setclientid_confi
|
|
|
* 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))
|
|
|
status = nfserr_clid_inuse;
|
|
|
- } else {
|
|
|
- clp = conf;
|
|
|
+ else
|
|
|
status = nfs_ok;
|
|
|
- }
|
|
|
} else if (!conf && unconf
|
|
|
&& cmp_verf(&unconf->cl_confirm, &confirm)) {
|
|
|
/* CASE 3:
|
|
@@ -924,8 +909,8 @@ nfsd4_setclientid_confirm(struct svc_rqst *rqstp, struct nfsd4_setclientid_confi
|
|
|
if (conf) {
|
|
|
expire_client(conf);
|
|
|
}
|
|
|
- clp = unconf;
|
|
|
move_to_confirmed(unconf);
|
|
|
+ conf = unconf;
|
|
|
status = nfs_ok;
|
|
|
}
|
|
|
} else if ((!conf || (conf && !cmp_verf(&conf->cl_confirm, &confirm)))
|
|
@@ -944,7 +929,7 @@ nfsd4_setclientid_confirm(struct svc_rqst *rqstp, struct nfsd4_setclientid_confi
|
|
|
}
|
|
|
out:
|
|
|
if (!status)
|
|
|
- nfsd4_probe_callback(clp);
|
|
|
+ nfsd4_probe_callback(conf);
|
|
|
nfs4_unlock_state();
|
|
|
return status;
|
|
|
}
|