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

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

SUNRPC: move bkl locking and xdr proc invocation into a common helper



Since every invocation of xdr encode or decode functions takes the BKL now,
there's a lot of redundant lock_kernel/unlock_kernel pairs that we can pull
out into a common function.

Signed-off-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent e3a535e1
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@
#include <linux/uio.h>
#include <asm/byteorder.h>
#include <linux/scatterlist.h>
#include <linux/smp_lock.h>

/*
 * Buffer adjustment
@@ -35,6 +36,21 @@ struct xdr_netobj {
 */
typedef int	(*kxdrproc_t)(void *rqstp, __be32 *data, void *obj);

/*
 * We're still requiring the BKL in the xdr code until it's been
 * more carefully audited, at which point this wrapper will become
 * unnecessary.
 */
static inline int rpc_call_xdrproc(kxdrproc_t xdrproc, void *rqstp, __be32 *data, void *obj)
{
	int ret;

	lock_kernel();
	ret = xdrproc(rqstp, data, obj);
	unlock_kernel();
	return ret;
}

/*
 * Basic structure for transmission/reception of a client XDR message.
 * Features a header (for a linear buffer containing RPC headers
+2 −11
Original line number Diff line number Diff line
@@ -13,7 +13,6 @@
#include <linux/errno.h>
#include <linux/sunrpc/clnt.h>
#include <linux/spinlock.h>
#include <linux/smp_lock.h>

#ifdef RPC_DEBUG
# define RPCDBG_FACILITY	RPCDBG_AUTH
@@ -476,17 +475,13 @@ rpcauth_wrap_req(struct rpc_task *task, kxdrproc_t encode, void *rqstp,
		__be32 *data, void *obj)
{
	struct rpc_cred *cred = task->tk_msg.rpc_cred;
	int ret;

	dprintk("RPC: %5u using %s cred %p to wrap rpc data\n",
			task->tk_pid, cred->cr_ops->cr_name, cred);
	if (cred->cr_ops->crwrap_req)
		return cred->cr_ops->crwrap_req(task, encode, rqstp, data, obj);
	/* By default, we encode the arguments normally. */
	lock_kernel();
	ret = encode(rqstp, data, obj);
	unlock_kernel();
	return ret;
	return rpc_call_xdrproc(encode, rqstp, data, obj);
}

int
@@ -494,7 +489,6 @@ rpcauth_unwrap_resp(struct rpc_task *task, kxdrproc_t decode, void *rqstp,
		__be32 *data, void *obj)
{
	struct rpc_cred *cred = task->tk_msg.rpc_cred;
	int ret;

	dprintk("RPC: %5u using %s cred %p to unwrap rpc data\n",
			task->tk_pid, cred->cr_ops->cr_name, cred);
@@ -502,10 +496,7 @@ rpcauth_unwrap_resp(struct rpc_task *task, kxdrproc_t decode, void *rqstp,
		return cred->cr_ops->crunwrap_resp(task, decode, rqstp,
						   data, obj);
	/* By default, we decode the arguments normally. */
	lock_kernel();
	ret = decode(rqstp, data, obj);
	unlock_kernel();
	return ret;
	return rpc_call_xdrproc(decode, rqstp, data, obj);
}

int
+5 −16
Original line number Diff line number Diff line
@@ -43,7 +43,6 @@
#include <linux/types.h>
#include <linux/slab.h>
#include <linux/sched.h>
#include <linux/smp_lock.h>
#include <linux/pagemap.h>
#include <linux/sunrpc/clnt.h>
#include <linux/sunrpc/auth.h>
@@ -1000,9 +999,7 @@ gss_wrap_req_integ(struct rpc_cred *cred, struct gss_cl_ctx *ctx,
	offset = (u8 *)p - (u8 *)snd_buf->head[0].iov_base;
	*p++ = htonl(rqstp->rq_seqno);

	lock_kernel();
	status = encode(rqstp, p, obj);
	unlock_kernel();
	status = rpc_call_xdrproc(encode, rqstp, p, obj);
	if (status)
		return status;

@@ -1096,9 +1093,7 @@ gss_wrap_req_priv(struct rpc_cred *cred, struct gss_cl_ctx *ctx,
	offset = (u8 *)p - (u8 *)snd_buf->head[0].iov_base;
	*p++ = htonl(rqstp->rq_seqno);

	lock_kernel();
	status = encode(rqstp, p, obj);
	unlock_kernel();
	status = rpc_call_xdrproc(encode, rqstp, p, obj);
	if (status)
		return status;

@@ -1157,16 +1152,12 @@ gss_wrap_req(struct rpc_task *task,
		/* The spec seems a little ambiguous here, but I think that not
		 * wrapping context destruction requests makes the most sense.
		 */
		lock_kernel();
		status = encode(rqstp, p, obj);
		unlock_kernel();
		status = rpc_call_xdrproc(encode, rqstp, p, obj);
		goto out;
	}
	switch (gss_cred->gc_service) {
		case RPC_GSS_SVC_NONE:
			lock_kernel();
			status = encode(rqstp, p, obj);
			unlock_kernel();
			status = rpc_call_xdrproc(encode, rqstp, p, obj);
			break;
		case RPC_GSS_SVC_INTEGRITY:
			status = gss_wrap_req_integ(cred, ctx, encode,
@@ -1282,9 +1273,7 @@ gss_unwrap_resp(struct rpc_task *task,
	cred->cr_auth->au_rslack = cred->cr_auth->au_verfsize + (p - savedp)
						+ (savedlen - head->iov_len);
out_decode:
	lock_kernel();
	status = decode(rqstp, p, obj);
	unlock_kernel();
	status = rpc_call_xdrproc(decode, rqstp, p, obj);
out:
	gss_put_ctx(ctx);
	dprintk("RPC: %5u gss_unwrap_resp returning %d\n", task->tk_pid,