|
@@ -13,6 +13,7 @@
|
|
|
#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
|
|
@@ -475,13 +476,17 @@ 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. */
|
|
|
- return encode(rqstp, data, obj);
|
|
|
+ lock_kernel();
|
|
|
+ ret = encode(rqstp, data, obj);
|
|
|
+ unlock_kernel();
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
int
|
|
@@ -489,6 +494,7 @@ 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);
|
|
@@ -496,7 +502,10 @@ 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. */
|
|
|
- return decode(rqstp, data, obj);
|
|
|
+ lock_kernel();
|
|
|
+ ret = decode(rqstp, data, obj);
|
|
|
+ unlock_kernel();
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
int
|