Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5cc40fd7 authored by Trond Myklebust's avatar Trond Myklebust Committed by J. Bruce Fields
Browse files

nfsd: Move create_client() call outside the lock



For efficiency reasons, and because we want to use spin locks instead
of relying on the client_mutex.

Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent 425510f5
Loading
Loading
Loading
Loading
+19 −16
Original line number Original line Diff line number Diff line
@@ -2181,6 +2181,10 @@ nfsd4_exchange_id(struct svc_rqst *rqstp,
		return nfserr_encr_alg_unsupp;
		return nfserr_encr_alg_unsupp;
	}
	}


	new = create_client(exid->clname, rqstp, &verf);
	if (new == NULL)
		return nfserr_jukebox;

	/* Cases below refer to rfc 5661 section 18.35.4: */
	/* Cases below refer to rfc 5661 section 18.35.4: */
	nfs4_lock_state();
	nfs4_lock_state();
	conf = find_confirmed_client_by_name(&exid->clname, nn);
	conf = find_confirmed_client_by_name(&exid->clname, nn);
@@ -2207,7 +2211,6 @@ nfsd4_exchange_id(struct svc_rqst *rqstp,
			}
			}
			/* case 6 */
			/* case 6 */
			exid->flags |= EXCHGID4_FLAG_CONFIRMED_R;
			exid->flags |= EXCHGID4_FLAG_CONFIRMED_R;
			new = conf;
			goto out_copy;
			goto out_copy;
		}
		}
		if (!creds_match) { /* case 3 */
		if (!creds_match) { /* case 3 */
@@ -2220,7 +2223,6 @@ nfsd4_exchange_id(struct svc_rqst *rqstp,
		}
		}
		if (verfs_match) { /* case 2 */
		if (verfs_match) { /* case 2 */
			conf->cl_exchange_flags |= EXCHGID4_FLAG_CONFIRMED_R;
			conf->cl_exchange_flags |= EXCHGID4_FLAG_CONFIRMED_R;
			new = conf;
			goto out_copy;
			goto out_copy;
		}
		}
		/* case 5, client reboot */
		/* case 5, client reboot */
@@ -2238,29 +2240,28 @@ nfsd4_exchange_id(struct svc_rqst *rqstp,


	/* case 1 (normal case) */
	/* case 1 (normal case) */
out_new:
out_new:
	new = create_client(exid->clname, rqstp, &verf);
	if (new == NULL) {
		status = nfserr_jukebox;
		goto out;
	}
	new->cl_minorversion = cstate->minorversion;
	new->cl_minorversion = cstate->minorversion;
	new->cl_mach_cred = (exid->spa_how == SP4_MACH_CRED);
	new->cl_mach_cred = (exid->spa_how == SP4_MACH_CRED);


	gen_clid(new, nn);
	gen_clid(new, nn);
	add_to_unconfirmed(new);
	add_to_unconfirmed(new);
	conf = new;
	new = NULL;
out_copy:
out_copy:
	exid->clientid.cl_boot = new->cl_clientid.cl_boot;
	exid->clientid.cl_boot = conf->cl_clientid.cl_boot;
	exid->clientid.cl_id = new->cl_clientid.cl_id;
	exid->clientid.cl_id = conf->cl_clientid.cl_id;


	exid->seqid = new->cl_cs_slot.sl_seqid + 1;
	exid->seqid = conf->cl_cs_slot.sl_seqid + 1;
	nfsd4_set_ex_flags(new, exid);
	nfsd4_set_ex_flags(conf, exid);


	dprintk("nfsd4_exchange_id seqid %d flags %x\n",
	dprintk("nfsd4_exchange_id seqid %d flags %x\n",
		new->cl_cs_slot.sl_seqid, new->cl_exchange_flags);
		conf->cl_cs_slot.sl_seqid, conf->cl_exchange_flags);
	status = nfs_ok;
	status = nfs_ok;


out:
out:
	nfs4_unlock_state();
	nfs4_unlock_state();
	if (new)
		free_client(new);
	return status;
	return status;
}
}


@@ -2903,6 +2904,9 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
	__be32 			status;
	__be32 			status;
	struct nfsd_net		*nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
	struct nfsd_net		*nn = net_generic(SVC_NET(rqstp), nfsd_net_id);


	new = create_client(clname, rqstp, &clverifier);
	if (new == NULL)
		return nfserr_jukebox;
	/* Cases below refer to rfc 3530 section 14.2.33: */
	/* Cases below refer to rfc 3530 section 14.2.33: */
	nfs4_lock_state();
	nfs4_lock_state();
	conf = find_confirmed_client_by_name(&clname, nn);
	conf = find_confirmed_client_by_name(&clname, nn);
@@ -2923,10 +2927,6 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
	unconf = find_unconfirmed_client_by_name(&clname, nn);
	unconf = find_unconfirmed_client_by_name(&clname, nn);
	if (unconf)
	if (unconf)
		expire_client(unconf);
		expire_client(unconf);
	status = nfserr_jukebox;
	new = create_client(clname, rqstp, &clverifier);
	if (new == NULL)
		goto out;
	if (conf && same_verf(&conf->cl_verifier, &clverifier))
	if (conf && same_verf(&conf->cl_verifier, &clverifier))
		/* case 1: probable callback update */
		/* case 1: probable callback update */
		copy_clid(new, conf);
		copy_clid(new, conf);
@@ -2938,9 +2938,12 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
	setclid->se_clientid.cl_boot = new->cl_clientid.cl_boot;
	setclid->se_clientid.cl_boot = new->cl_clientid.cl_boot;
	setclid->se_clientid.cl_id = new->cl_clientid.cl_id;
	setclid->se_clientid.cl_id = new->cl_clientid.cl_id;
	memcpy(setclid->se_confirm.data, new->cl_confirm.data, sizeof(setclid->se_confirm.data));
	memcpy(setclid->se_confirm.data, new->cl_confirm.data, sizeof(setclid->se_confirm.data));
	new = NULL;
	status = nfs_ok;
	status = nfs_ok;
out:
out:
	nfs4_unlock_state();
	nfs4_unlock_state();
	if (new)
		free_client(new);
	return status;
	return status;
}
}