nfsd41: Refactor create_client()
Move common initialization of 'struct nfs4_client' inside create_client(). Signed-off-by: Ricardo Labiaga <Ricardo.Labiaga@netapp.com> [nfsd41: Remember the auth flavor to use for callbacks] Signed-off-by: Ricardo Labiaga <Ricardo.Labiaga@netapp.com> Signed-off-by: Benny Halevy <bhalevy@panasas.com> Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
This commit is contained in:
parent
3ddc8bf5f3
commit
b09333c464
1 changed files with 45 additions and 44 deletions
|
@ -759,27 +759,6 @@ expire_client(struct nfs4_client *clp)
|
||||||
put_nfs4_client(clp);
|
put_nfs4_client(clp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct nfs4_client *create_client(struct xdr_netobj name, char *recdir)
|
|
||||||
{
|
|
||||||
struct nfs4_client *clp;
|
|
||||||
|
|
||||||
clp = alloc_client(name);
|
|
||||||
if (clp == NULL)
|
|
||||||
return NULL;
|
|
||||||
memcpy(clp->cl_recdir, recdir, HEXDIR_LEN);
|
|
||||||
atomic_set(&clp->cl_count, 1);
|
|
||||||
atomic_set(&clp->cl_cb_conn.cb_set, 0);
|
|
||||||
INIT_LIST_HEAD(&clp->cl_idhash);
|
|
||||||
INIT_LIST_HEAD(&clp->cl_strhash);
|
|
||||||
INIT_LIST_HEAD(&clp->cl_openowners);
|
|
||||||
INIT_LIST_HEAD(&clp->cl_delegations);
|
|
||||||
INIT_LIST_HEAD(&clp->cl_sessions);
|
|
||||||
INIT_LIST_HEAD(&clp->cl_lru);
|
|
||||||
clear_bit(0, &clp->cl_cb_slot_busy);
|
|
||||||
rpc_init_wait_queue(&clp->cl_cb_waitq, "Backchannel slot table");
|
|
||||||
return clp;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void copy_verf(struct nfs4_client *target, nfs4_verifier *source)
|
static void copy_verf(struct nfs4_client *target, nfs4_verifier *source)
|
||||||
{
|
{
|
||||||
memcpy(target->cl_verifier.data, source->data,
|
memcpy(target->cl_verifier.data, source->data,
|
||||||
|
@ -842,6 +821,46 @@ static void gen_confirm(struct nfs4_client *clp)
|
||||||
*p++ = i++;
|
*p++ = i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct nfs4_client *create_client(struct xdr_netobj name, char *recdir,
|
||||||
|
struct svc_rqst *rqstp, nfs4_verifier *verf)
|
||||||
|
{
|
||||||
|
struct nfs4_client *clp;
|
||||||
|
struct sockaddr *sa = svc_addr(rqstp);
|
||||||
|
char *princ;
|
||||||
|
|
||||||
|
clp = alloc_client(name);
|
||||||
|
if (clp == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
princ = svc_gss_principal(rqstp);
|
||||||
|
if (princ) {
|
||||||
|
clp->cl_principal = kstrdup(princ, GFP_KERNEL);
|
||||||
|
if (clp->cl_principal == NULL) {
|
||||||
|
free_client(clp);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(clp->cl_recdir, recdir, HEXDIR_LEN);
|
||||||
|
atomic_set(&clp->cl_count, 1);
|
||||||
|
atomic_set(&clp->cl_cb_conn.cb_set, 0);
|
||||||
|
INIT_LIST_HEAD(&clp->cl_idhash);
|
||||||
|
INIT_LIST_HEAD(&clp->cl_strhash);
|
||||||
|
INIT_LIST_HEAD(&clp->cl_openowners);
|
||||||
|
INIT_LIST_HEAD(&clp->cl_delegations);
|
||||||
|
INIT_LIST_HEAD(&clp->cl_sessions);
|
||||||
|
INIT_LIST_HEAD(&clp->cl_lru);
|
||||||
|
clear_bit(0, &clp->cl_cb_slot_busy);
|
||||||
|
rpc_init_wait_queue(&clp->cl_cb_waitq, "Backchannel slot table");
|
||||||
|
copy_verf(clp, verf);
|
||||||
|
rpc_copy_addr((struct sockaddr *) &clp->cl_addr, sa);
|
||||||
|
clp->cl_flavor = rqstp->rq_flavor;
|
||||||
|
copy_cred(&clp->cl_cred, &rqstp->rq_cred);
|
||||||
|
gen_confirm(clp);
|
||||||
|
|
||||||
|
return clp;
|
||||||
|
}
|
||||||
|
|
||||||
static int check_name(struct xdr_netobj name)
|
static int check_name(struct xdr_netobj name)
|
||||||
{
|
{
|
||||||
if (name.len == 0)
|
if (name.len == 0)
|
||||||
|
@ -1189,17 +1208,13 @@ nfsd4_exchange_id(struct svc_rqst *rqstp,
|
||||||
|
|
||||||
out_new:
|
out_new:
|
||||||
/* Normal case */
|
/* Normal case */
|
||||||
new = create_client(exid->clname, dname);
|
new = create_client(exid->clname, dname, rqstp, &verf);
|
||||||
if (new == NULL) {
|
if (new == NULL) {
|
||||||
status = nfserr_serverfault;
|
status = nfserr_serverfault;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
copy_verf(new, &verf);
|
|
||||||
copy_cred(&new->cl_cred, &rqstp->rq_cred);
|
|
||||||
rpc_copy_addr((struct sockaddr *) &new->cl_addr, sa);
|
|
||||||
gen_clid(new);
|
gen_clid(new);
|
||||||
gen_confirm(new);
|
|
||||||
add_to_unconfirmed(new, strhashval);
|
add_to_unconfirmed(new, strhashval);
|
||||||
out_copy:
|
out_copy:
|
||||||
exid->clientid.cl_boot = new->cl_clientid.cl_boot;
|
exid->clientid.cl_boot = new->cl_clientid.cl_boot;
|
||||||
|
@ -1473,7 +1488,6 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
|
||||||
unsigned int strhashval;
|
unsigned int strhashval;
|
||||||
struct nfs4_client *conf, *unconf, *new;
|
struct nfs4_client *conf, *unconf, *new;
|
||||||
__be32 status;
|
__be32 status;
|
||||||
char *princ;
|
|
||||||
char dname[HEXDIR_LEN];
|
char dname[HEXDIR_LEN];
|
||||||
|
|
||||||
if (!check_name(clname))
|
if (!check_name(clname))
|
||||||
|
@ -1518,7 +1532,7 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
|
||||||
*/
|
*/
|
||||||
if (unconf)
|
if (unconf)
|
||||||
expire_client(unconf);
|
expire_client(unconf);
|
||||||
new = create_client(clname, dname);
|
new = create_client(clname, dname, rqstp, &clverifier);
|
||||||
if (new == NULL)
|
if (new == NULL)
|
||||||
goto out;
|
goto out;
|
||||||
gen_clid(new);
|
gen_clid(new);
|
||||||
|
@ -1535,7 +1549,7 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
|
||||||
*/
|
*/
|
||||||
expire_client(unconf);
|
expire_client(unconf);
|
||||||
}
|
}
|
||||||
new = create_client(clname, dname);
|
new = create_client(clname, dname, rqstp, &clverifier);
|
||||||
if (new == NULL)
|
if (new == NULL)
|
||||||
goto out;
|
goto out;
|
||||||
copy_clid(new, conf);
|
copy_clid(new, conf);
|
||||||
|
@ -1545,7 +1559,7 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
|
||||||
* probable client reboot; state will be removed if
|
* probable client reboot; state will be removed if
|
||||||
* confirmed.
|
* confirmed.
|
||||||
*/
|
*/
|
||||||
new = create_client(clname, dname);
|
new = create_client(clname, dname, rqstp, &clverifier);
|
||||||
if (new == NULL)
|
if (new == NULL)
|
||||||
goto out;
|
goto out;
|
||||||
gen_clid(new);
|
gen_clid(new);
|
||||||
|
@ -1556,24 +1570,11 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
|
||||||
* confirmed.
|
* confirmed.
|
||||||
*/
|
*/
|
||||||
expire_client(unconf);
|
expire_client(unconf);
|
||||||
new = create_client(clname, dname);
|
new = create_client(clname, dname, rqstp, &clverifier);
|
||||||
if (new == NULL)
|
if (new == NULL)
|
||||||
goto out;
|
goto out;
|
||||||
gen_clid(new);
|
gen_clid(new);
|
||||||
}
|
}
|
||||||
copy_verf(new, &clverifier);
|
|
||||||
rpc_copy_addr((struct sockaddr *) &new->cl_addr, sa);
|
|
||||||
new->cl_flavor = rqstp->rq_flavor;
|
|
||||||
princ = svc_gss_principal(rqstp);
|
|
||||||
if (princ) {
|
|
||||||
new->cl_principal = kstrdup(princ, GFP_KERNEL);
|
|
||||||
if (new->cl_principal == NULL) {
|
|
||||||
free_client(new);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
copy_cred(&new->cl_cred, &rqstp->rq_cred);
|
|
||||||
gen_confirm(new);
|
|
||||||
gen_callback(new, setclid, rpc_get_scope_id(sa));
|
gen_callback(new, setclid, rpc_get_scope_id(sa));
|
||||||
add_to_unconfirmed(new, strhashval);
|
add_to_unconfirmed(new, strhashval);
|
||||||
setclid->se_clientid.cl_boot = new->cl_clientid.cl_boot;
|
setclid->se_clientid.cl_boot = new->cl_clientid.cl_boot;
|
||||||
|
|
Loading…
Add table
Reference in a new issue