Commit 5d351754 authored by Trond Myklebust's avatar Trond Myklebust Committed by J. Bruce Fields

SUNRPC: Defer the auth_gss upcall when the RPC call is asynchronous

Otherwise, the upcall is going to be synchronous, which may not be what the
caller wants...
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
parent 886e3b7f
...@@ -111,7 +111,7 @@ struct rpc_credops { ...@@ -111,7 +111,7 @@ struct rpc_credops {
void (*crdestroy)(struct rpc_cred *); void (*crdestroy)(struct rpc_cred *);
int (*crmatch)(struct auth_cred *, struct rpc_cred *, int); int (*crmatch)(struct auth_cred *, struct rpc_cred *, int);
void (*crbind)(struct rpc_task *, struct rpc_cred *); void (*crbind)(struct rpc_task *, struct rpc_cred *, int);
__be32 * (*crmarshal)(struct rpc_task *, __be32 *); __be32 * (*crmarshal)(struct rpc_task *, __be32 *);
int (*crrefresh)(struct rpc_task *); int (*crrefresh)(struct rpc_task *);
__be32 * (*crvalidate)(struct rpc_task *, __be32 *); __be32 * (*crvalidate)(struct rpc_task *, __be32 *);
...@@ -140,7 +140,7 @@ struct rpc_cred * rpcauth_lookup_credcache(struct rpc_auth *, struct auth_cred * ...@@ -140,7 +140,7 @@ struct rpc_cred * rpcauth_lookup_credcache(struct rpc_auth *, struct auth_cred *
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);
void rpcauth_bindcred(struct rpc_task *, struct rpc_cred *, int); void rpcauth_bindcred(struct rpc_task *, struct rpc_cred *, int);
void rpcauth_generic_bind_cred(struct rpc_task *, struct rpc_cred *); void 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 *); void rpcauth_unbindcred(struct rpc_task *);
__be32 * rpcauth_marshcred(struct rpc_task *, __be32 *); __be32 * rpcauth_marshcred(struct rpc_task *, __be32 *);
......
...@@ -385,7 +385,7 @@ rpcauth_init_cred(struct rpc_cred *cred, const struct auth_cred *acred, ...@@ -385,7 +385,7 @@ rpcauth_init_cred(struct rpc_cred *cred, const struct auth_cred *acred,
EXPORT_SYMBOL_GPL(rpcauth_init_cred); EXPORT_SYMBOL_GPL(rpcauth_init_cred);
void void
rpcauth_generic_bind_cred(struct rpc_task *task, struct rpc_cred *cred) rpcauth_generic_bind_cred(struct rpc_task *task, struct rpc_cred *cred, int lookupflags)
{ {
task->tk_msg.rpc_cred = get_rpccred(cred); task->tk_msg.rpc_cred = get_rpccred(cred);
dprintk("RPC: %5u holding %s cred %p\n", task->tk_pid, dprintk("RPC: %5u holding %s cred %p\n", task->tk_pid,
...@@ -394,7 +394,7 @@ rpcauth_generic_bind_cred(struct rpc_task *task, struct rpc_cred *cred) ...@@ -394,7 +394,7 @@ rpcauth_generic_bind_cred(struct rpc_task *task, struct rpc_cred *cred)
EXPORT_SYMBOL_GPL(rpcauth_generic_bind_cred); EXPORT_SYMBOL_GPL(rpcauth_generic_bind_cred);
static void static void
rpcauth_bind_root_cred(struct rpc_task *task) rpcauth_bind_root_cred(struct rpc_task *task, int lookupflags)
{ {
struct rpc_auth *auth = task->tk_client->cl_auth; struct rpc_auth *auth = task->tk_client->cl_auth;
struct auth_cred acred = { struct auth_cred acred = {
...@@ -405,7 +405,7 @@ rpcauth_bind_root_cred(struct rpc_task *task) ...@@ -405,7 +405,7 @@ rpcauth_bind_root_cred(struct rpc_task *task)
dprintk("RPC: %5u looking up %s cred\n", dprintk("RPC: %5u looking up %s cred\n",
task->tk_pid, task->tk_client->cl_auth->au_ops->au_name); task->tk_pid, task->tk_client->cl_auth->au_ops->au_name);
ret = auth->au_ops->lookup_cred(auth, &acred, 0); ret = auth->au_ops->lookup_cred(auth, &acred, lookupflags);
if (!IS_ERR(ret)) if (!IS_ERR(ret))
task->tk_msg.rpc_cred = ret; task->tk_msg.rpc_cred = ret;
else else
...@@ -413,14 +413,14 @@ rpcauth_bind_root_cred(struct rpc_task *task) ...@@ -413,14 +413,14 @@ rpcauth_bind_root_cred(struct rpc_task *task)
} }
static void static void
rpcauth_bind_new_cred(struct rpc_task *task) rpcauth_bind_new_cred(struct rpc_task *task, int lookupflags)
{ {
struct rpc_auth *auth = task->tk_client->cl_auth; struct rpc_auth *auth = task->tk_client->cl_auth;
struct rpc_cred *ret; struct rpc_cred *ret;
dprintk("RPC: %5u looking up %s cred\n", dprintk("RPC: %5u looking up %s cred\n",
task->tk_pid, auth->au_ops->au_name); task->tk_pid, auth->au_ops->au_name);
ret = rpcauth_lookupcred(auth, 0); ret = rpcauth_lookupcred(auth, lookupflags);
if (!IS_ERR(ret)) if (!IS_ERR(ret))
task->tk_msg.rpc_cred = ret; task->tk_msg.rpc_cred = ret;
else else
...@@ -430,12 +430,16 @@ rpcauth_bind_new_cred(struct rpc_task *task) ...@@ -430,12 +430,16 @@ rpcauth_bind_new_cred(struct rpc_task *task)
void void
rpcauth_bindcred(struct rpc_task *task, struct rpc_cred *cred, int flags) rpcauth_bindcred(struct rpc_task *task, struct rpc_cred *cred, int flags)
{ {
int lookupflags = 0;
if (flags & RPC_TASK_ASYNC)
lookupflags |= RPCAUTH_LOOKUP_NEW;
if (cred != NULL) if (cred != NULL)
cred->cr_ops->crbind(task, cred); cred->cr_ops->crbind(task, cred, lookupflags);
else if (flags & RPC_TASK_ROOTCREDS) else if (flags & RPC_TASK_ROOTCREDS)
rpcauth_bind_root_cred(task); rpcauth_bind_root_cred(task, lookupflags);
else else
rpcauth_bind_new_cred(task); rpcauth_bind_new_cred(task, lookupflags);
} }
void void
......
...@@ -55,13 +55,13 @@ struct rpc_cred *rpc_lookup_machine_cred(void) ...@@ -55,13 +55,13 @@ struct rpc_cred *rpc_lookup_machine_cred(void)
EXPORT_SYMBOL_GPL(rpc_lookup_machine_cred); EXPORT_SYMBOL_GPL(rpc_lookup_machine_cred);
static void static void
generic_bind_cred(struct rpc_task *task, struct rpc_cred *cred) generic_bind_cred(struct rpc_task *task, struct rpc_cred *cred, int lookupflags)
{ {
struct rpc_auth *auth = task->tk_client->cl_auth; struct rpc_auth *auth = task->tk_client->cl_auth;
struct auth_cred *acred = &container_of(cred, struct generic_cred, gc_base)->acred; struct auth_cred *acred = &container_of(cred, struct generic_cred, gc_base)->acred;
struct rpc_cred *ret; struct rpc_cred *ret;
ret = auth->au_ops->lookup_cred(auth, acred, 0); ret = auth->au_ops->lookup_cred(auth, acred, lookupflags);
if (!IS_ERR(ret)) if (!IS_ERR(ret))
task->tk_msg.rpc_cred = ret; task->tk_msg.rpc_cred = ret;
else else
......
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