Commit 28ce6054 authored by NeilBrown's avatar NeilBrown Committed by Linus Torvalds

[PATCH] knfsd: nfsd4: add find_{un}conf_by_str functions to simplify setclientid

Minor setclientid cleanup
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 a55370a3
...@@ -509,6 +509,30 @@ find_unconfirmed_client(clientid_t *clid) ...@@ -509,6 +509,30 @@ find_unconfirmed_client(clientid_t *clid)
return NULL; return NULL;
} }
static struct nfs4_client *
find_confirmed_client_by_str(const char *dname, unsigned int hashval)
{
struct nfs4_client *clp;
list_for_each_entry(clp, &conf_str_hashtbl[hashval], cl_strhash) {
if (same_name(clp->cl_recdir, dname))
return clp;
}
return NULL;
}
static struct nfs4_client *
find_unconfirmed_client_by_str(const char *dname, unsigned int hashval)
{
struct nfs4_client *clp;
list_for_each_entry(clp, &unconf_str_hashtbl[hashval], cl_strhash) {
if (same_name(clp->cl_recdir, dname))
return clp;
}
return NULL;
}
/* a helper function for parse_callback */ /* a helper function for parse_callback */
static int static int
parse_octet(unsigned int *lenp, char **addrp) parse_octet(unsigned int *lenp, char **addrp)
...@@ -647,7 +671,7 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_setclientid *setclid) ...@@ -647,7 +671,7 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_setclientid *setclid)
}; };
nfs4_verifier clverifier = setclid->se_verf; nfs4_verifier clverifier = setclid->se_verf;
unsigned int strhashval; unsigned int strhashval;
struct nfs4_client * conf, * unconf, * new, * clp; struct nfs4_client *conf, *unconf, *new;
int status; int status;
char dname[HEXDIR_LEN]; char dname[HEXDIR_LEN];
...@@ -666,35 +690,24 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_setclientid *setclid) ...@@ -666,35 +690,24 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_setclientid *setclid)
strhashval = clientstr_hashval(dname); strhashval = clientstr_hashval(dname);
conf = NULL;
nfs4_lock_state(); nfs4_lock_state();
list_for_each_entry(clp, &conf_str_hashtbl[strhashval], cl_strhash) { conf = find_confirmed_client_by_str(dname, strhashval);
if (!same_name(clp->cl_recdir, dname)) if (conf) {
continue;
/* /*
* CASE 0: * CASE 0:
* clname match, confirmed, different principal * clname match, confirmed, different principal
* or different ip_address * or different ip_address
*/ */
status = nfserr_clid_inuse; status = nfserr_clid_inuse;
if (!cmp_creds(&clp->cl_cred,&rqstp->rq_cred) if (!cmp_creds(&conf->cl_cred, &rqstp->rq_cred)
|| clp->cl_addr != ip_addr) { || conf->cl_addr != ip_addr) {
printk("NFSD: setclientid: string in use by client" printk("NFSD: setclientid: string in use by client"
"(clientid %08x/%08x)\n", "(clientid %08x/%08x)\n",
clp->cl_clientid.cl_boot, clp->cl_clientid.cl_id); conf->cl_clientid.cl_boot, conf->cl_clientid.cl_id);
goto out; goto out;
} }
conf = clp;
break;
}
unconf = NULL;
list_for_each_entry(clp, &unconf_str_hashtbl[strhashval], cl_strhash) {
if (!same_name(clp->cl_recdir, dname))
continue;
/* cl_name match from a previous SETCLIENTID operation */
unconf = clp;
break;
} }
unconf = find_unconfirmed_client_by_str(dname, strhashval);
status = nfserr_resource; status = nfserr_resource;
if (!conf) { if (!conf) {
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment