Commit a17c2153 authored by Trond Myklebust's avatar Trond Myklebust

SUNRPC: Move the bound cred to struct rpc_rqst

This will allow us to save the original generic cred in rpc_message, so
that if we migrate from one server to another, we can generate a new bound
cred without having to punt back to the NFS layer.
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 8572b8e2
...@@ -233,7 +233,7 @@ nfs_xdr_removeargs(struct rpc_rqst *req, __be32 *p, const struct nfs_removeargs ...@@ -233,7 +233,7 @@ nfs_xdr_removeargs(struct rpc_rqst *req, __be32 *p, const struct nfs_removeargs
static int static int
nfs_xdr_readargs(struct rpc_rqst *req, __be32 *p, struct nfs_readargs *args) nfs_xdr_readargs(struct rpc_rqst *req, __be32 *p, struct nfs_readargs *args)
{ {
struct rpc_auth *auth = req->rq_task->tk_msg.rpc_cred->cr_auth; struct rpc_auth *auth = req->rq_cred->cr_auth;
unsigned int replen; unsigned int replen;
u32 offset = (u32)args->offset; u32 offset = (u32)args->offset;
u32 count = args->count; u32 count = args->count;
...@@ -393,8 +393,7 @@ nfs_xdr_symlinkargs(struct rpc_rqst *req, __be32 *p, struct nfs_symlinkargs *arg ...@@ -393,8 +393,7 @@ nfs_xdr_symlinkargs(struct rpc_rqst *req, __be32 *p, struct nfs_symlinkargs *arg
static int static int
nfs_xdr_readdirargs(struct rpc_rqst *req, __be32 *p, struct nfs_readdirargs *args) nfs_xdr_readdirargs(struct rpc_rqst *req, __be32 *p, struct nfs_readdirargs *args)
{ {
struct rpc_task *task = req->rq_task; struct rpc_auth *auth = req->rq_cred->cr_auth;
struct rpc_auth *auth = task->tk_msg.rpc_cred->cr_auth;
unsigned int replen; unsigned int replen;
u32 count = args->count; u32 count = args->count;
...@@ -575,7 +574,7 @@ nfs_xdr_diropres(struct rpc_rqst *req, __be32 *p, struct nfs_diropok *res) ...@@ -575,7 +574,7 @@ nfs_xdr_diropres(struct rpc_rqst *req, __be32 *p, struct nfs_diropok *res)
static int static int
nfs_xdr_readlinkargs(struct rpc_rqst *req, __be32 *p, struct nfs_readlinkargs *args) nfs_xdr_readlinkargs(struct rpc_rqst *req, __be32 *p, struct nfs_readlinkargs *args)
{ {
struct rpc_auth *auth = req->rq_task->tk_msg.rpc_cred->cr_auth; struct rpc_auth *auth = req->rq_cred->cr_auth;
unsigned int replen; unsigned int replen;
p = xdr_encode_fhandle(p, args->fh); p = xdr_encode_fhandle(p, args->fh);
......
...@@ -330,7 +330,7 @@ nfs3_xdr_accessargs(struct rpc_rqst *req, __be32 *p, struct nfs3_accessargs *arg ...@@ -330,7 +330,7 @@ nfs3_xdr_accessargs(struct rpc_rqst *req, __be32 *p, struct nfs3_accessargs *arg
static int static int
nfs3_xdr_readargs(struct rpc_rqst *req, __be32 *p, struct nfs_readargs *args) nfs3_xdr_readargs(struct rpc_rqst *req, __be32 *p, struct nfs_readargs *args)
{ {
struct rpc_auth *auth = req->rq_task->tk_msg.rpc_cred->cr_auth; struct rpc_auth *auth = req->rq_cred->cr_auth;
unsigned int replen; unsigned int replen;
u32 count = args->count; u32 count = args->count;
...@@ -471,7 +471,7 @@ nfs3_xdr_linkargs(struct rpc_rqst *req, __be32 *p, struct nfs3_linkargs *args) ...@@ -471,7 +471,7 @@ nfs3_xdr_linkargs(struct rpc_rqst *req, __be32 *p, struct nfs3_linkargs *args)
static int static int
nfs3_xdr_readdirargs(struct rpc_rqst *req, __be32 *p, struct nfs3_readdirargs *args) nfs3_xdr_readdirargs(struct rpc_rqst *req, __be32 *p, struct nfs3_readdirargs *args)
{ {
struct rpc_auth *auth = req->rq_task->tk_msg.rpc_cred->cr_auth; struct rpc_auth *auth = req->rq_cred->cr_auth;
unsigned int replen; unsigned int replen;
u32 count = args->count; u32 count = args->count;
...@@ -675,7 +675,7 @@ static int ...@@ -675,7 +675,7 @@ static int
nfs3_xdr_getaclargs(struct rpc_rqst *req, __be32 *p, nfs3_xdr_getaclargs(struct rpc_rqst *req, __be32 *p,
struct nfs3_getaclargs *args) struct nfs3_getaclargs *args)
{ {
struct rpc_auth *auth = req->rq_task->tk_msg.rpc_cred->cr_auth; struct rpc_auth *auth = req->rq_cred->cr_auth;
unsigned int replen; unsigned int replen;
p = xdr_encode_fhandle(p, args->fh); p = xdr_encode_fhandle(p, args->fh);
...@@ -802,7 +802,7 @@ nfs3_xdr_accessres(struct rpc_rqst *req, __be32 *p, struct nfs3_accessres *res) ...@@ -802,7 +802,7 @@ nfs3_xdr_accessres(struct rpc_rqst *req, __be32 *p, struct nfs3_accessres *res)
static int static int
nfs3_xdr_readlinkargs(struct rpc_rqst *req, __be32 *p, struct nfs3_readlinkargs *args) nfs3_xdr_readlinkargs(struct rpc_rqst *req, __be32 *p, struct nfs3_readlinkargs *args)
{ {
struct rpc_auth *auth = req->rq_task->tk_msg.rpc_cred->cr_auth; struct rpc_auth *auth = req->rq_cred->cr_auth;
unsigned int replen; unsigned int replen;
p = xdr_encode_fhandle(p, args->fh); p = xdr_encode_fhandle(p, args->fh);
......
...@@ -758,7 +758,7 @@ static void encode_compound_hdr(struct xdr_stream *xdr, ...@@ -758,7 +758,7 @@ static void encode_compound_hdr(struct xdr_stream *xdr,
struct compound_hdr *hdr) struct compound_hdr *hdr)
{ {
__be32 *p; __be32 *p;
struct rpc_auth *auth = req->rq_task->tk_msg.rpc_cred->cr_auth; struct rpc_auth *auth = req->rq_cred->cr_auth;
/* initialize running count of expected bytes in reply. /* initialize running count of expected bytes in reply.
* NOTE: the replied tag SHOULD be the same is the one sent, * NOTE: the replied tag SHOULD be the same is the one sent,
......
...@@ -135,10 +135,8 @@ void rpcauth_release(struct rpc_auth *); ...@@ -135,10 +135,8 @@ void rpcauth_release(struct rpc_auth *);
struct rpc_cred * rpcauth_lookup_credcache(struct rpc_auth *, struct auth_cred *, int); struct rpc_cred * rpcauth_lookup_credcache(struct rpc_auth *, struct auth_cred *, int);
void rpcauth_init_cred(struct rpc_cred *, const struct auth_cred *, struct rpc_auth *, const struct rpc_credops *); void rpcauth_init_cred(struct rpc_cred *, const struct auth_cred *, struct rpc_auth *, const struct rpc_credops *);
struct rpc_cred * rpcauth_lookupcred(struct rpc_auth *, int); struct rpc_cred * rpcauth_lookupcred(struct rpc_auth *, int);
int rpcauth_bindcred(struct rpc_task *, struct rpc_cred *, int);
struct rpc_cred * rpcauth_generic_bind_cred(struct rpc_task *, struct rpc_cred *, int); struct rpc_cred * rpcauth_generic_bind_cred(struct rpc_task *, struct rpc_cred *, int);
void put_rpccred(struct rpc_cred *); void put_rpccred(struct rpc_cred *);
void rpcauth_unbindcred(struct rpc_task *);
__be32 * rpcauth_marshcred(struct rpc_task *, __be32 *); __be32 * rpcauth_marshcred(struct rpc_task *, __be32 *);
__be32 * rpcauth_checkverf(struct rpc_task *, __be32 *); __be32 * rpcauth_checkverf(struct rpc_task *, __be32 *);
int rpcauth_wrap_req(struct rpc_task *task, kxdrproc_t encode, void *rqstp, __be32 *data, void *obj); int rpcauth_wrap_req(struct rpc_task *task, kxdrproc_t encode, void *rqstp, __be32 *data, void *obj);
......
...@@ -64,6 +64,7 @@ struct rpc_rqst { ...@@ -64,6 +64,7 @@ struct rpc_rqst {
* This is the private part * This is the private part
*/ */
struct rpc_task * rq_task; /* RPC task data */ struct rpc_task * rq_task; /* RPC task data */
struct rpc_cred * rq_cred; /* Bound cred */
__be32 rq_xid; /* request XID */ __be32 rq_xid; /* request XID */
int rq_cong; /* has incremented xprt->cong */ int rq_cong; /* has incremented xprt->cong */
u32 rq_seqno; /* gss seq no. used on req. */ u32 rq_seqno; /* gss seq no. used on req. */
......
...@@ -477,9 +477,10 @@ rpcauth_bind_new_cred(struct rpc_task *task, int lookupflags) ...@@ -477,9 +477,10 @@ rpcauth_bind_new_cred(struct rpc_task *task, int lookupflags)
return rpcauth_lookupcred(auth, lookupflags); return rpcauth_lookupcred(auth, lookupflags);
} }
int static int
rpcauth_bindcred(struct rpc_task *task, struct rpc_cred *cred, int flags) rpcauth_bindcred(struct rpc_task *task, struct rpc_cred *cred, int flags)
{ {
struct rpc_rqst *req = task->tk_rqstp;
struct rpc_cred *new; struct rpc_cred *new;
int lookupflags = 0; int lookupflags = 0;
...@@ -493,9 +494,9 @@ rpcauth_bindcred(struct rpc_task *task, struct rpc_cred *cred, int flags) ...@@ -493,9 +494,9 @@ rpcauth_bindcred(struct rpc_task *task, struct rpc_cred *cred, int flags)
new = rpcauth_bind_new_cred(task, lookupflags); new = rpcauth_bind_new_cred(task, lookupflags);
if (IS_ERR(new)) if (IS_ERR(new))
return PTR_ERR(new); return PTR_ERR(new);
if (task->tk_msg.rpc_cred != NULL) if (req->rq_cred != NULL)
put_rpccred(task->tk_msg.rpc_cred); put_rpccred(req->rq_cred);
task->tk_msg.rpc_cred = new; req->rq_cred = new;
return 0; return 0;
} }
...@@ -535,22 +536,10 @@ put_rpccred(struct rpc_cred *cred) ...@@ -535,22 +536,10 @@ put_rpccred(struct rpc_cred *cred)
} }
EXPORT_SYMBOL_GPL(put_rpccred); EXPORT_SYMBOL_GPL(put_rpccred);
void
rpcauth_unbindcred(struct rpc_task *task)
{
struct rpc_cred *cred = task->tk_msg.rpc_cred;
dprintk("RPC: %5u releasing %s cred %p\n",
task->tk_pid, cred->cr_auth->au_ops->au_name, cred);
put_rpccred(cred);
task->tk_msg.rpc_cred = NULL;
}
__be32 * __be32 *
rpcauth_marshcred(struct rpc_task *task, __be32 *p) rpcauth_marshcred(struct rpc_task *task, __be32 *p)
{ {
struct rpc_cred *cred = task->tk_msg.rpc_cred; struct rpc_cred *cred = task->tk_rqstp->rq_cred;
dprintk("RPC: %5u marshaling %s cred %p\n", dprintk("RPC: %5u marshaling %s cred %p\n",
task->tk_pid, cred->cr_auth->au_ops->au_name, cred); task->tk_pid, cred->cr_auth->au_ops->au_name, cred);
...@@ -561,7 +550,7 @@ rpcauth_marshcred(struct rpc_task *task, __be32 *p) ...@@ -561,7 +550,7 @@ rpcauth_marshcred(struct rpc_task *task, __be32 *p)
__be32 * __be32 *
rpcauth_checkverf(struct rpc_task *task, __be32 *p) rpcauth_checkverf(struct rpc_task *task, __be32 *p)
{ {
struct rpc_cred *cred = task->tk_msg.rpc_cred; struct rpc_cred *cred = task->tk_rqstp->rq_cred;
dprintk("RPC: %5u validating %s cred %p\n", dprintk("RPC: %5u validating %s cred %p\n",
task->tk_pid, cred->cr_auth->au_ops->au_name, cred); task->tk_pid, cred->cr_auth->au_ops->au_name, cred);
...@@ -573,7 +562,7 @@ int ...@@ -573,7 +562,7 @@ int
rpcauth_wrap_req(struct rpc_task *task, kxdrproc_t encode, void *rqstp, 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_rqstp->rq_cred;
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);
...@@ -587,7 +576,7 @@ int ...@@ -587,7 +576,7 @@ int
rpcauth_unwrap_resp(struct rpc_task *task, kxdrproc_t decode, void *rqstp, 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_rqstp->rq_cred;
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);
...@@ -601,13 +590,21 @@ rpcauth_unwrap_resp(struct rpc_task *task, kxdrproc_t decode, void *rqstp, ...@@ -601,13 +590,21 @@ rpcauth_unwrap_resp(struct rpc_task *task, kxdrproc_t decode, void *rqstp,
int int
rpcauth_refreshcred(struct rpc_task *task) rpcauth_refreshcred(struct rpc_task *task)
{ {
struct rpc_cred *cred = task->tk_msg.rpc_cred; struct rpc_cred *cred = task->tk_rqstp->rq_cred;
int err; int err;
cred = task->tk_rqstp->rq_cred;
if (cred == NULL) {
err = rpcauth_bindcred(task, task->tk_msg.rpc_cred, task->tk_flags);
if (err < 0)
goto out;
cred = task->tk_rqstp->rq_cred;
};
dprintk("RPC: %5u refreshing %s cred %p\n", dprintk("RPC: %5u refreshing %s cred %p\n",
task->tk_pid, cred->cr_auth->au_ops->au_name, cred); task->tk_pid, cred->cr_auth->au_ops->au_name, cred);
err = cred->cr_ops->crrefresh(task); err = cred->cr_ops->crrefresh(task);
out:
if (err < 0) if (err < 0)
task->tk_status = err; task->tk_status = err;
return err; return err;
...@@ -616,7 +613,7 @@ rpcauth_refreshcred(struct rpc_task *task) ...@@ -616,7 +613,7 @@ rpcauth_refreshcred(struct rpc_task *task)
void void
rpcauth_invalcred(struct rpc_task *task) rpcauth_invalcred(struct rpc_task *task)
{ {
struct rpc_cred *cred = task->tk_msg.rpc_cred; struct rpc_cred *cred = task->tk_rqstp->rq_cred;
dprintk("RPC: %5u invalidating %s cred %p\n", dprintk("RPC: %5u invalidating %s cred %p\n",
task->tk_pid, cred->cr_auth->au_ops->au_name, cred); task->tk_pid, cred->cr_auth->au_ops->au_name, cred);
...@@ -627,7 +624,7 @@ rpcauth_invalcred(struct rpc_task *task) ...@@ -627,7 +624,7 @@ rpcauth_invalcred(struct rpc_task *task)
int int
rpcauth_uptodatecred(struct rpc_task *task) rpcauth_uptodatecred(struct rpc_task *task)
{ {
struct rpc_cred *cred = task->tk_msg.rpc_cred; struct rpc_cred *cred = task->tk_rqstp->rq_cred;
return cred == NULL || return cred == NULL ||
test_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags) != 0; test_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags) != 0;
......
...@@ -373,7 +373,7 @@ gss_handle_downcall_result(struct gss_cred *gss_cred, struct gss_upcall_msg *gss ...@@ -373,7 +373,7 @@ gss_handle_downcall_result(struct gss_cred *gss_cred, struct gss_upcall_msg *gss
static void static void
gss_upcall_callback(struct rpc_task *task) gss_upcall_callback(struct rpc_task *task)
{ {
struct gss_cred *gss_cred = container_of(task->tk_msg.rpc_cred, struct gss_cred *gss_cred = container_of(task->tk_rqstp->rq_cred,
struct gss_cred, gc_base); struct gss_cred, gc_base);
struct gss_upcall_msg *gss_msg = gss_cred->gc_upcall; struct gss_upcall_msg *gss_msg = gss_cred->gc_upcall;
struct inode *inode = &gss_msg->inode->vfs_inode; struct inode *inode = &gss_msg->inode->vfs_inode;
...@@ -502,7 +502,7 @@ static void warn_gssd(void) ...@@ -502,7 +502,7 @@ static void warn_gssd(void)
static inline int static inline int
gss_refresh_upcall(struct rpc_task *task) gss_refresh_upcall(struct rpc_task *task)
{ {
struct rpc_cred *cred = task->tk_msg.rpc_cred; struct rpc_cred *cred = task->tk_rqstp->rq_cred;
struct gss_auth *gss_auth = container_of(cred->cr_auth, struct gss_auth *gss_auth = container_of(cred->cr_auth,
struct gss_auth, rpc_auth); struct gss_auth, rpc_auth);
struct gss_cred *gss_cred = container_of(cred, struct gss_cred *gss_cred = container_of(cred,
...@@ -1064,12 +1064,12 @@ gss_match(struct auth_cred *acred, struct rpc_cred *rc, int flags) ...@@ -1064,12 +1064,12 @@ gss_match(struct auth_cred *acred, struct rpc_cred *rc, int flags)
static __be32 * static __be32 *
gss_marshal(struct rpc_task *task, __be32 *p) gss_marshal(struct rpc_task *task, __be32 *p)
{ {
struct rpc_cred *cred = task->tk_msg.rpc_cred; struct rpc_rqst *req = task->tk_rqstp;
struct rpc_cred *cred = req->rq_cred;
struct gss_cred *gss_cred = container_of(cred, struct gss_cred, struct gss_cred *gss_cred = container_of(cred, struct gss_cred,
gc_base); gc_base);
struct gss_cl_ctx *ctx = gss_cred_get_ctx(cred); struct gss_cl_ctx *ctx = gss_cred_get_ctx(cred);
__be32 *cred_len; __be32 *cred_len;
struct rpc_rqst *req = task->tk_rqstp;
u32 maj_stat = 0; u32 maj_stat = 0;
struct xdr_netobj mic; struct xdr_netobj mic;
struct kvec iov; struct kvec iov;
...@@ -1119,7 +1119,7 @@ gss_marshal(struct rpc_task *task, __be32 *p) ...@@ -1119,7 +1119,7 @@ gss_marshal(struct rpc_task *task, __be32 *p)
static int gss_renew_cred(struct rpc_task *task) static int gss_renew_cred(struct rpc_task *task)
{ {
struct rpc_cred *oldcred = task->tk_msg.rpc_cred; struct rpc_cred *oldcred = task->tk_rqstp->rq_cred;
struct gss_cred *gss_cred = container_of(oldcred, struct gss_cred *gss_cred = container_of(oldcred,
struct gss_cred, struct gss_cred,
gc_base); gc_base);
...@@ -1133,7 +1133,7 @@ static int gss_renew_cred(struct rpc_task *task) ...@@ -1133,7 +1133,7 @@ static int gss_renew_cred(struct rpc_task *task)
new = gss_lookup_cred(auth, &acred, RPCAUTH_LOOKUP_NEW); new = gss_lookup_cred(auth, &acred, RPCAUTH_LOOKUP_NEW);
if (IS_ERR(new)) if (IS_ERR(new))
return PTR_ERR(new); return PTR_ERR(new);
task->tk_msg.rpc_cred = new; task->tk_rqstp->rq_cred = new;
put_rpccred(oldcred); put_rpccred(oldcred);
return 0; return 0;
} }
...@@ -1161,7 +1161,7 @@ static int gss_cred_is_negative_entry(struct rpc_cred *cred) ...@@ -1161,7 +1161,7 @@ static int gss_cred_is_negative_entry(struct rpc_cred *cred)
static int static int
gss_refresh(struct rpc_task *task) gss_refresh(struct rpc_task *task)
{ {
struct rpc_cred *cred = task->tk_msg.rpc_cred; struct rpc_cred *cred = task->tk_rqstp->rq_cred;
int ret = 0; int ret = 0;
if (gss_cred_is_negative_entry(cred)) if (gss_cred_is_negative_entry(cred))
...@@ -1172,7 +1172,7 @@ gss_refresh(struct rpc_task *task) ...@@ -1172,7 +1172,7 @@ gss_refresh(struct rpc_task *task)
ret = gss_renew_cred(task); ret = gss_renew_cred(task);
if (ret < 0) if (ret < 0)
goto out; goto out;
cred = task->tk_msg.rpc_cred; cred = task->tk_rqstp->rq_cred;
} }
if (test_bit(RPCAUTH_CRED_NEW, &cred->cr_flags)) if (test_bit(RPCAUTH_CRED_NEW, &cred->cr_flags))
...@@ -1191,7 +1191,7 @@ gss_refresh_null(struct rpc_task *task) ...@@ -1191,7 +1191,7 @@ gss_refresh_null(struct rpc_task *task)
static __be32 * static __be32 *
gss_validate(struct rpc_task *task, __be32 *p) gss_validate(struct rpc_task *task, __be32 *p)
{ {
struct rpc_cred *cred = task->tk_msg.rpc_cred; struct rpc_cred *cred = task->tk_rqstp->rq_cred;
struct gss_cl_ctx *ctx = gss_cred_get_ctx(cred); struct gss_cl_ctx *ctx = gss_cred_get_ctx(cred);
__be32 seq; __be32 seq;
struct kvec iov; struct kvec iov;
...@@ -1400,7 +1400,7 @@ static int ...@@ -1400,7 +1400,7 @@ static int
gss_wrap_req(struct rpc_task *task, gss_wrap_req(struct rpc_task *task,
kxdrproc_t encode, void *rqstp, __be32 *p, void *obj) kxdrproc_t encode, void *rqstp, __be32 *p, void *obj)
{ {
struct rpc_cred *cred = task->tk_msg.rpc_cred; struct rpc_cred *cred = task->tk_rqstp->rq_cred;
struct gss_cred *gss_cred = container_of(cred, struct gss_cred, struct gss_cred *gss_cred = container_of(cred, struct gss_cred,
gc_base); gc_base);
struct gss_cl_ctx *ctx = gss_cred_get_ctx(cred); struct gss_cl_ctx *ctx = gss_cred_get_ctx(cred);
...@@ -1503,7 +1503,7 @@ static int ...@@ -1503,7 +1503,7 @@ static int
gss_unwrap_resp(struct rpc_task *task, gss_unwrap_resp(struct rpc_task *task,
kxdrproc_t decode, void *rqstp, __be32 *p, void *obj) kxdrproc_t decode, void *rqstp, __be32 *p, void *obj)
{ {
struct rpc_cred *cred = task->tk_msg.rpc_cred; struct rpc_cred *cred = task->tk_rqstp->rq_cred;
struct gss_cred *gss_cred = container_of(cred, struct gss_cred, struct gss_cred *gss_cred = container_of(cred, struct gss_cred,
gc_base); gc_base);
struct gss_cl_ctx *ctx = gss_cred_get_ctx(cred); struct gss_cl_ctx *ctx = gss_cred_get_ctx(cred);
......
...@@ -75,7 +75,7 @@ nul_marshal(struct rpc_task *task, __be32 *p) ...@@ -75,7 +75,7 @@ nul_marshal(struct rpc_task *task, __be32 *p)
static int static int
nul_refresh(struct rpc_task *task) nul_refresh(struct rpc_task *task)
{ {
set_bit(RPCAUTH_CRED_UPTODATE, &task->tk_msg.rpc_cred->cr_flags); set_bit(RPCAUTH_CRED_UPTODATE, &task->tk_rqstp->rq_cred->cr_flags);
return 0; return 0;
} }
......
...@@ -140,7 +140,7 @@ static __be32 * ...@@ -140,7 +140,7 @@ static __be32 *
unx_marshal(struct rpc_task *task, __be32 *p) unx_marshal(struct rpc_task *task, __be32 *p)
{ {
struct rpc_clnt *clnt = task->tk_client; struct rpc_clnt *clnt = task->tk_client;
struct unx_cred *cred = container_of(task->tk_msg.rpc_cred, struct unx_cred, uc_base); struct unx_cred *cred = container_of(task->tk_rqstp->rq_cred, struct unx_cred, uc_base);
__be32 *base, *hold; __be32 *base, *hold;
int i; int i;
...@@ -173,7 +173,7 @@ unx_marshal(struct rpc_task *task, __be32 *p) ...@@ -173,7 +173,7 @@ unx_marshal(struct rpc_task *task, __be32 *p)
static int static int
unx_refresh(struct rpc_task *task) unx_refresh(struct rpc_task *task)
{ {
set_bit(RPCAUTH_CRED_UPTODATE, &task->tk_msg.rpc_cred->cr_flags); set_bit(RPCAUTH_CRED_UPTODATE, &task->tk_rqstp->rq_cred->cr_flags);
return 0; return 0;
} }
...@@ -196,7 +196,7 @@ unx_validate(struct rpc_task *task, __be32 *p) ...@@ -196,7 +196,7 @@ unx_validate(struct rpc_task *task, __be32 *p)
printk("RPC: giant verf size: %u\n", size); printk("RPC: giant verf size: %u\n", size);
return NULL; return NULL;
} }
task->tk_msg.rpc_cred->cr_auth->au_rslack = (size >> 2) + 2; task->tk_rqstp->rq_cred->cr_auth->au_rslack = (size >> 2) + 2;
p += (size >> 2); p += (size >> 2);
return p; return p;
......
...@@ -605,8 +605,8 @@ rpc_task_set_rpc_message(struct rpc_task *task, const struct rpc_message *msg) ...@@ -605,8 +605,8 @@ rpc_task_set_rpc_message(struct rpc_task *task, const struct rpc_message *msg)
task->tk_msg.rpc_proc = msg->rpc_proc; task->tk_msg.rpc_proc = msg->rpc_proc;
task->tk_msg.rpc_argp = msg->rpc_argp; task->tk_msg.rpc_argp = msg->rpc_argp;
task->tk_msg.rpc_resp = msg->rpc_resp; task->tk_msg.rpc_resp = msg->rpc_resp;
/* Bind the user cred */ if (msg->rpc_cred != NULL)
task->tk_status = rpcauth_bindcred(task, msg->rpc_cred, task->tk_flags); task->tk_msg.rpc_cred = get_rpccred(msg->rpc_cred);
} }
} }
...@@ -909,11 +909,6 @@ call_reserve(struct rpc_task *task) ...@@ -909,11 +909,6 @@ call_reserve(struct rpc_task *task)
{ {
dprint_status(task); dprint_status(task);
if (!rpcauth_uptodatecred(task)) {
task->tk_action = call_refresh;
return;
}
task->tk_status = 0; task->tk_status = 0;
task->tk_action = call_reserveresult; task->tk_action = call_reserveresult;
xprt_reserve(task); xprt_reserve(task);
...@@ -977,7 +972,7 @@ call_reserveresult(struct rpc_task *task) ...@@ -977,7 +972,7 @@ call_reserveresult(struct rpc_task *task)
static void static void
call_allocate(struct rpc_task *task) call_allocate(struct rpc_task *task)
{ {
unsigned int slack = task->tk_msg.rpc_cred->cr_auth->au_cslack; unsigned int slack = task->tk_client->cl_auth->au_cslack;
struct rpc_rqst *req = task->tk_rqstp; struct rpc_rqst *req = task->tk_rqstp;
struct rpc_xprt *xprt = task->tk_xprt; struct rpc_xprt *xprt = task->tk_xprt;
struct rpc_procinfo *proc = task->tk_msg.rpc_proc; struct rpc_procinfo *proc = task->tk_msg.rpc_proc;
...@@ -985,7 +980,7 @@ call_allocate(struct rpc_task *task) ...@@ -985,7 +980,7 @@ call_allocate(struct rpc_task *task)
dprint_status(task); dprint_status(task);
task->tk_status = 0; task->tk_status = 0;
task->tk_action = call_bind; task->tk_action = call_refresh;
if (req->rq_buffer) if (req->rq_buffer)
return; return;
...@@ -1022,6 +1017,47 @@ call_allocate(struct rpc_task *task) ...@@ -1022,6 +1017,47 @@ call_allocate(struct rpc_task *task)
rpc_exit(task, -ERESTARTSYS); rpc_exit(task, -ERESTARTSYS);
} }
/*
* 2a. Bind and/or refresh the credentials
*/
static void
call_refresh(struct rpc_task *task)
{
dprint_status(task);
task->tk_action = call_refreshresult;
task->tk_status = 0;
task->tk_client->cl_stats->rpcauthrefresh++;
rpcauth_refreshcred(task);
}
/*
* 2b. Process the results of a credential refresh
*/
static void
call_refreshresult(struct rpc_task *task)
{
int status = task->tk_status;
dprint_status(task);
task->tk_status = 0;
task->tk_action = call_bind;
if (status >= 0 && rpcauth_uptodatecred(task))
return;
switch (status) {
case -EACCES:
rpc_exit(task, -EACCES);
return;
case -ENOMEM:
rpc_exit(task, -ENOMEM);
return;
case -ETIMEDOUT:
rpc_delay(task, 3*HZ);
}
task->tk_action = call_refresh;
}
static inline int static inline int
rpc_task_need_encode(struct rpc_task *task) rpc_task_need_encode(struct rpc_task *task)
{ {
...@@ -1557,43 +1593,6 @@ call_decode(struct rpc_task *task) ...@@ -1557,43 +1593,6 @@ call_decode(struct rpc_task *task)
} }
} }
/*
* 8. Refresh the credentials if rejected by the server
*/
static void
call_refresh(struct rpc_task *task)
{
dprint_status(task);
task->tk_action = call_refreshresult;
task->tk_status = 0;
task->tk_client->cl_stats->rpcauthrefresh++;
rpcauth_refreshcred(task);
}
/*
* 8a. Process the results of a credential refresh
*/
static void
call_refreshresult(struct rpc_task *task)
{
int status = task->tk_status;
dprint_status(task);
task->tk_status = 0;
task->tk_action = call_reserve;
if (status >= 0 && rpcauth_uptodatecred(task))
return;
if (status == -EACCES) {
rpc_exit(task, -EACCES);
return;
}
task->tk_action = call_refresh;
if (status != -ETIMEDOUT)
rpc_delay(task, 3*HZ);
}
static __be32 * static __be32 *
rpc_encode_header(struct rpc_task *task) rpc_encode_header(struct rpc_task *task)
{ {
......
...@@ -864,7 +864,7 @@ void rpc_put_task(struct rpc_task *task) ...@@ -864,7 +864,7 @@ void rpc_put_task(struct rpc_task *task)
if (task->tk_rqstp) if (task->tk_rqstp)
xprt_release(task); xprt_release(task);
if (task->tk_msg.rpc_cred) if (task->tk_msg.rpc_cred)
rpcauth_unbindcred(task); put_rpccred(task->tk_msg.rpc_cred);
rpc_task_release_client(task); rpc_task_release_client(task);
if (task->tk_workqueue != NULL) { if (task->tk_workqueue != NULL) {
INIT_WORK(&task->u.tk_work, rpc_async_release); INIT_WORK(&task->u.tk_work, rpc_async_release);
......
...@@ -1032,6 +1032,8 @@ void xprt_release(struct rpc_task *task) ...@@ -1032,6 +1032,8 @@ void xprt_release(struct rpc_task *task)
spin_unlock_bh(&xprt->transport_lock); spin_unlock_bh(&xprt->transport_lock);
if (req->rq_buffer) if (req->rq_buffer)
xprt->ops->buf_free(req->rq_buffer); xprt->ops->buf_free(req->rq_buffer);
if (req->rq_cred != NULL)
put_rpccred(req->rq_cred);
task->tk_rqstp = NULL; task->tk_rqstp = NULL;
if (req->rq_release_snd_buf) if (req->rq_release_snd_buf)
req->rq_release_snd_buf(req); req->rq_release_snd_buf(req);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment