mirror of
https://github.com/adulau/aha.git
synced 2024-12-29 12:16:20 +00:00
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: J. Bruce Fields <bfields@citi.umich.edu> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
e3a535e173
commit
be879c4e24
3 changed files with 23 additions and 27 deletions
|
@ -12,6 +12,7 @@
|
||||||
#include <linux/uio.h>
|
#include <linux/uio.h>
|
||||||
#include <asm/byteorder.h>
|
#include <asm/byteorder.h>
|
||||||
#include <linux/scatterlist.h>
|
#include <linux/scatterlist.h>
|
||||||
|
#include <linux/smp_lock.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Buffer adjustment
|
* Buffer adjustment
|
||||||
|
@ -35,6 +36,21 @@ struct xdr_netobj {
|
||||||
*/
|
*/
|
||||||
typedef int (*kxdrproc_t)(void *rqstp, __be32 *data, void *obj);
|
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.
|
* Basic structure for transmission/reception of a client XDR message.
|
||||||
* Features a header (for a linear buffer containing RPC headers
|
* Features a header (for a linear buffer containing RPC headers
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/sunrpc/clnt.h>
|
#include <linux/sunrpc/clnt.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
|
|
||||||
#ifdef RPC_DEBUG
|
#ifdef RPC_DEBUG
|
||||||
# define RPCDBG_FACILITY RPCDBG_AUTH
|
# 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)
|
__be32 *data, void *obj)
|
||||||
{
|
{
|
||||||
struct rpc_cred *cred = task->tk_msg.rpc_cred;
|
struct rpc_cred *cred = task->tk_msg.rpc_cred;
|
||||||
int ret;
|
|
||||||
|
|
||||||
dprintk("RPC: %5u using %s cred %p to wrap rpc data\n",
|
dprintk("RPC: %5u using %s cred %p to wrap rpc data\n",
|
||||||
task->tk_pid, cred->cr_ops->cr_name, cred);
|
task->tk_pid, cred->cr_ops->cr_name, cred);
|
||||||
if (cred->cr_ops->crwrap_req)
|
if (cred->cr_ops->crwrap_req)
|
||||||
return cred->cr_ops->crwrap_req(task, encode, rqstp, data, obj);
|
return cred->cr_ops->crwrap_req(task, encode, rqstp, data, obj);
|
||||||
/* By default, we encode the arguments normally. */
|
/* By default, we encode the arguments normally. */
|
||||||
lock_kernel();
|
return rpc_call_xdrproc(encode, rqstp, data, obj);
|
||||||
ret = encode(rqstp, data, obj);
|
|
||||||
unlock_kernel();
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -494,7 +489,6 @@ rpcauth_unwrap_resp(struct rpc_task *task, kxdrproc_t decode, void *rqstp,
|
||||||
__be32 *data, void *obj)
|
__be32 *data, void *obj)
|
||||||
{
|
{
|
||||||
struct rpc_cred *cred = task->tk_msg.rpc_cred;
|
struct rpc_cred *cred = task->tk_msg.rpc_cred;
|
||||||
int ret;
|
|
||||||
|
|
||||||
dprintk("RPC: %5u using %s cred %p to unwrap rpc data\n",
|
dprintk("RPC: %5u using %s cred %p to unwrap rpc data\n",
|
||||||
task->tk_pid, cred->cr_ops->cr_name, cred);
|
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,
|
return cred->cr_ops->crunwrap_resp(task, decode, rqstp,
|
||||||
data, obj);
|
data, obj);
|
||||||
/* By default, we decode the arguments normally. */
|
/* By default, we decode the arguments normally. */
|
||||||
lock_kernel();
|
return rpc_call_xdrproc(decode, rqstp, data, obj);
|
||||||
ret = decode(rqstp, data, obj);
|
|
||||||
unlock_kernel();
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
|
@ -43,7 +43,6 @@
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/pagemap.h>
|
#include <linux/pagemap.h>
|
||||||
#include <linux/sunrpc/clnt.h>
|
#include <linux/sunrpc/clnt.h>
|
||||||
#include <linux/sunrpc/auth.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;
|
offset = (u8 *)p - (u8 *)snd_buf->head[0].iov_base;
|
||||||
*p++ = htonl(rqstp->rq_seqno);
|
*p++ = htonl(rqstp->rq_seqno);
|
||||||
|
|
||||||
lock_kernel();
|
status = rpc_call_xdrproc(encode, rqstp, p, obj);
|
||||||
status = encode(rqstp, p, obj);
|
|
||||||
unlock_kernel();
|
|
||||||
if (status)
|
if (status)
|
||||||
return 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;
|
offset = (u8 *)p - (u8 *)snd_buf->head[0].iov_base;
|
||||||
*p++ = htonl(rqstp->rq_seqno);
|
*p++ = htonl(rqstp->rq_seqno);
|
||||||
|
|
||||||
lock_kernel();
|
status = rpc_call_xdrproc(encode, rqstp, p, obj);
|
||||||
status = encode(rqstp, p, obj);
|
|
||||||
unlock_kernel();
|
|
||||||
if (status)
|
if (status)
|
||||||
return 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
|
/* The spec seems a little ambiguous here, but I think that not
|
||||||
* wrapping context destruction requests makes the most sense.
|
* wrapping context destruction requests makes the most sense.
|
||||||
*/
|
*/
|
||||||
lock_kernel();
|
status = rpc_call_xdrproc(encode, rqstp, p, obj);
|
||||||
status = encode(rqstp, p, obj);
|
|
||||||
unlock_kernel();
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
switch (gss_cred->gc_service) {
|
switch (gss_cred->gc_service) {
|
||||||
case RPC_GSS_SVC_NONE:
|
case RPC_GSS_SVC_NONE:
|
||||||
lock_kernel();
|
status = rpc_call_xdrproc(encode, rqstp, p, obj);
|
||||||
status = encode(rqstp, p, obj);
|
|
||||||
unlock_kernel();
|
|
||||||
break;
|
break;
|
||||||
case RPC_GSS_SVC_INTEGRITY:
|
case RPC_GSS_SVC_INTEGRITY:
|
||||||
status = gss_wrap_req_integ(cred, ctx, encode,
|
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)
|
cred->cr_auth->au_rslack = cred->cr_auth->au_verfsize + (p - savedp)
|
||||||
+ (savedlen - head->iov_len);
|
+ (savedlen - head->iov_len);
|
||||||
out_decode:
|
out_decode:
|
||||||
lock_kernel();
|
status = rpc_call_xdrproc(decode, rqstp, p, obj);
|
||||||
status = decode(rqstp, p, obj);
|
|
||||||
unlock_kernel();
|
|
||||||
out:
|
out:
|
||||||
gss_put_ctx(ctx);
|
gss_put_ctx(ctx);
|
||||||
dprintk("RPC: %5u gss_unwrap_resp returning %d\n", task->tk_pid,
|
dprintk("RPC: %5u gss_unwrap_resp returning %d\n", task->tk_pid,
|
||||||
|
|
Loading…
Reference in a new issue