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

Commit a827bcb2 authored by J. Bruce Fields's avatar J. Bruce Fields
Browse files

nfsd4: clean up session allocation

parent 1377b69e
Loading
Loading
Loading
Loading
+20 −12
Original line number Diff line number Diff line
@@ -758,7 +758,7 @@ static void nfsd4_put_drc_mem(int slotsize, int num)
	spin_unlock(&nfsd_drc_lock);
}

static struct nfsd4_session *alloc_session(int slotsize, int numslots)
static struct nfsd4_session *__alloc_session(int slotsize, int numslots)
{
	struct nfsd4_session *new;
	int mem, i;
@@ -921,14 +921,10 @@ void nfsd4_put_session(struct nfsd4_session *ses)
	spin_unlock(&client_lock);
}

static struct nfsd4_session *alloc_init_session(struct svc_rqst *rqstp, struct nfs4_client *clp, struct nfsd4_create_session *cses)
static struct nfsd4_session *alloc_session(struct nfsd4_channel_attrs *fchan)
{
	struct nfsd4_session *new;
	struct nfsd4_conn *conn;
	struct nfsd4_channel_attrs *fchan = &cses->fore_channel;
	int numslots, slotsize;
	int idx;

	/*
	 * Note decreasing slot size below client's request may
	 * make it difficult for client to function correctly, whereas
@@ -941,13 +937,30 @@ static struct nfsd4_session *alloc_init_session(struct svc_rqst *rqstp, struct n
	if (numslots < 1)
		return NULL;

	new = alloc_session(slotsize, numslots);
	new = __alloc_session(slotsize, numslots);
	if (!new) {
		nfsd4_put_drc_mem(slotsize, fchan->maxreqs);
		return NULL;
	}
	init_forechannel_attrs(&new->se_fchannel, fchan, numslots, slotsize);
	return new;
}

static struct nfsd4_session *alloc_init_session(struct svc_rqst *rqstp, struct nfs4_client *clp, struct nfsd4_create_session *cses)
{
	struct nfsd4_session *new;
	struct nfsd4_conn *conn;
	int idx;

	new = alloc_session(&cses->fore_channel);
	if (!new)
		return NULL;

	conn = alloc_conn_from_crses(rqstp, cses);
	if (!conn) {
		__free_session(new);
		return NULL;
	}
	new->se_client = clp;
	gen_sessionid(new);

@@ -965,11 +978,6 @@ static struct nfsd4_session *alloc_init_session(struct svc_rqst *rqstp, struct n
	spin_unlock(&clp->cl_lock);
	spin_unlock(&client_lock);

	conn = alloc_conn_from_crses(rqstp, cses);
	if (!conn) {
		__free_session(new);
		return NULL;
	}
	nfsd4_init_conn(rqstp, conn, new);
	if (cses->flags & SESSION4_BACK_CHAN) {
		struct sockaddr *sa = svc_addr(rqstp);