diff options
| -rw-r--r-- | include/linux/sunrpc/xdr.h | 16 | ||||
| -rw-r--r-- | net/sunrpc/auth.c | 13 | ||||
| -rw-r--r-- | net/sunrpc/auth_gss/auth_gss.c | 21 | 
3 files changed, 23 insertions, 27 deletions
diff --git a/include/linux/sunrpc/xdr.h b/include/linux/sunrpc/xdr.h index 9e340fa23c0..c6b53d181bf 100644 --- a/include/linux/sunrpc/xdr.h +++ b/include/linux/sunrpc/xdr.h @@ -12,6 +12,7 @@  #include <linux/uio.h>  #include <asm/byteorder.h>  #include <linux/scatterlist.h> +#include <linux/smp_lock.h>  /*   * Buffer adjustment @@ -36,6 +37,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   * and the data payload for short messages), and then an array of diff --git a/net/sunrpc/auth.c b/net/sunrpc/auth.c index 29a8ecc6092..1ea27559b1d 100644 --- a/net/sunrpc/auth.c +++ b/net/sunrpc/auth.c @@ -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 diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c index abfda33bac6..4bbc59cc237 100644 --- a/net/sunrpc/auth_gss/auth_gss.c +++ b/net/sunrpc/auth_gss/auth_gss.c @@ -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,  |