|
@@ -759,27 +759,6 @@ expire_client(struct 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)
|
|
|
{
|
|
|
memcpy(target->cl_verifier.data, source->data,
|
|
@@ -842,6 +821,46 @@ static void gen_confirm(struct nfs4_client *clp)
|
|
|
*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)
|
|
|
{
|
|
|
if (name.len == 0)
|
|
@@ -1189,17 +1208,13 @@ nfsd4_exchange_id(struct svc_rqst *rqstp,
|
|
|
|
|
|
out_new:
|
|
|
/* Normal case */
|
|
|
- new = create_client(exid->clname, dname);
|
|
|
+ new = create_client(exid->clname, dname, rqstp, &verf);
|
|
|
if (new == NULL) {
|
|
|
status = nfserr_serverfault;
|
|
|
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_confirm(new);
|
|
|
add_to_unconfirmed(new, strhashval);
|
|
|
out_copy:
|
|
|
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;
|
|
|
struct nfs4_client *conf, *unconf, *new;
|
|
|
__be32 status;
|
|
|
- char *princ;
|
|
|
char dname[HEXDIR_LEN];
|
|
|
|
|
|
if (!check_name(clname))
|
|
@@ -1518,7 +1532,7 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
|
|
|
*/
|
|
|
if (unconf)
|
|
|
expire_client(unconf);
|
|
|
- new = create_client(clname, dname);
|
|
|
+ new = create_client(clname, dname, rqstp, &clverifier);
|
|
|
if (new == NULL)
|
|
|
goto out;
|
|
|
gen_clid(new);
|
|
@@ -1535,7 +1549,7 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
|
|
|
*/
|
|
|
expire_client(unconf);
|
|
|
}
|
|
|
- new = create_client(clname, dname);
|
|
|
+ new = create_client(clname, dname, rqstp, &clverifier);
|
|
|
if (new == NULL)
|
|
|
goto out;
|
|
|
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
|
|
|
* confirmed.
|
|
|
*/
|
|
|
- new = create_client(clname, dname);
|
|
|
+ new = create_client(clname, dname, rqstp, &clverifier);
|
|
|
if (new == NULL)
|
|
|
goto out;
|
|
|
gen_clid(new);
|
|
@@ -1556,24 +1570,11 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
|
|
|
* confirmed.
|
|
|
*/
|
|
|
expire_client(unconf);
|
|
|
- new = create_client(clname, dname);
|
|
|
+ new = create_client(clname, dname, rqstp, &clverifier);
|
|
|
if (new == NULL)
|
|
|
goto out;
|
|
|
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));
|
|
|
add_to_unconfirmed(new, strhashval);
|
|
|
setclid->se_clientid.cl_boot = new->cl_clientid.cl_boot;
|