Skip to content

Commit

Permalink
SUNRPC: Remove the last remnant of the BKL...
Browse files Browse the repository at this point in the history
Somehow, this escaped the previous purge. There should be no need to keep
any extra locks in the XDR callbacks.

The NFS client XDR code only writes into private objects, whereas all reads
of shared objects are confined to fields that do not change, such as
filehandles...

Ditto for lockd, the NFSv2/v3 client mount code, and rpcbind.

The nfsd XDR code may require the BKL, but since it does a synchronous RPC
call from a thread that already holds the lock, that issue is moot.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
  • Loading branch information
Trond Myklebust authored and Trond Myklebust committed Dec 23, 2008
1 parent 136221f commit 88a9fe8
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 22 deletions.
15 changes: 0 additions & 15 deletions include/linux/sunrpc/xdr.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,21 +36,6 @@ 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
Expand Down
4 changes: 2 additions & 2 deletions net/sunrpc/auth.c
Original file line number Diff line number Diff line change
Expand Up @@ -513,7 +513,7 @@ rpcauth_wrap_req(struct rpc_task *task, kxdrproc_t encode, void *rqstp,
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 rpc_call_xdrproc(encode, rqstp, data, obj);
return encode(rqstp, data, obj);
}

int
Expand All @@ -528,7 +528,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. */
return rpc_call_xdrproc(decode, rqstp, data, obj);
return decode(rqstp, data, obj);
}

int
Expand Down
10 changes: 5 additions & 5 deletions net/sunrpc/auth_gss/auth_gss.c
Original file line number Diff line number Diff line change
Expand Up @@ -1017,7 +1017,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);

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

Expand Down Expand Up @@ -1111,7 +1111,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);

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

Expand Down Expand Up @@ -1170,12 +1170,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.
*/
status = rpc_call_xdrproc(encode, rqstp, p, obj);
status = encode(rqstp, p, obj);
goto out;
}
switch (gss_cred->gc_service) {
case RPC_GSS_SVC_NONE:
status = rpc_call_xdrproc(encode, rqstp, p, obj);
status = encode(rqstp, p, obj);
break;
case RPC_GSS_SVC_INTEGRITY:
status = gss_wrap_req_integ(cred, ctx, encode,
Expand Down Expand Up @@ -1291,7 +1291,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:
status = rpc_call_xdrproc(decode, rqstp, p, obj);
status = decode(rqstp, p, obj);
out:
gss_put_ctx(ctx);
dprintk("RPC: %5u gss_unwrap_resp returning %d\n", task->tk_pid,
Expand Down

0 comments on commit 88a9fe8

Please sign in to comment.