diff options
-rw-r--r-- | include/linux/sunrpc/auth.h | 4 | ||||
-rw-r--r-- | net/sunrpc/auth.c | 28 | ||||
-rw-r--r-- | net/sunrpc/sched.c | 11 |
3 files changed, 23 insertions, 20 deletions
diff --git a/include/linux/sunrpc/auth.h b/include/linux/sunrpc/auth.h index 012566a6257b..348546c7826c 100644 --- a/include/linux/sunrpc/auth.h +++ b/include/linux/sunrpc/auth.h | |||
@@ -135,9 +135,7 @@ void rpcauth_release(struct rpc_auth *); | |||
135 | struct rpc_cred * rpcauth_lookup_credcache(struct rpc_auth *, struct auth_cred *, int); | 135 | struct rpc_cred * rpcauth_lookup_credcache(struct rpc_auth *, struct auth_cred *, int); |
136 | void rpcauth_init_cred(struct rpc_cred *, const struct auth_cred *, struct rpc_auth *, const struct rpc_credops *); | 136 | void rpcauth_init_cred(struct rpc_cred *, const struct auth_cred *, struct rpc_auth *, const struct rpc_credops *); |
137 | struct rpc_cred * rpcauth_lookupcred(struct rpc_auth *, int); | 137 | struct rpc_cred * rpcauth_lookupcred(struct rpc_auth *, int); |
138 | void rpcauth_bindcred(struct rpc_task *); | 138 | void rpcauth_bindcred(struct rpc_task *, struct rpc_cred *, int); |
139 | void rpcauth_bind_root_cred(struct rpc_task *); | ||
140 | void rpcauth_holdcred(struct rpc_task *); | ||
141 | void put_rpccred(struct rpc_cred *); | 139 | void put_rpccred(struct rpc_cred *); |
142 | void rpcauth_unbindcred(struct rpc_task *); | 140 | void rpcauth_unbindcred(struct rpc_task *); |
143 | __be32 * rpcauth_marshcred(struct rpc_task *, __be32 *); | 141 | __be32 * rpcauth_marshcred(struct rpc_task *, __be32 *); |
diff --git a/net/sunrpc/auth.c b/net/sunrpc/auth.c index b0f2b2ee7cc0..1cdb163c4f89 100644 --- a/net/sunrpc/auth.c +++ b/net/sunrpc/auth.c | |||
@@ -375,7 +375,15 @@ rpcauth_init_cred(struct rpc_cred *cred, const struct auth_cred *acred, | |||
375 | } | 375 | } |
376 | EXPORT_SYMBOL_GPL(rpcauth_init_cred); | 376 | EXPORT_SYMBOL_GPL(rpcauth_init_cred); |
377 | 377 | ||
378 | void | 378 | static void |
379 | rpcauth_generic_bind_cred(struct rpc_task *task, struct rpc_cred *cred) | ||
380 | { | ||
381 | task->tk_msg.rpc_cred = get_rpccred(cred); | ||
382 | dprintk("RPC: %5u holding %s cred %p\n", task->tk_pid, | ||
383 | cred->cr_auth->au_ops->au_name, cred); | ||
384 | } | ||
385 | |||
386 | static void | ||
379 | rpcauth_bind_root_cred(struct rpc_task *task) | 387 | rpcauth_bind_root_cred(struct rpc_task *task) |
380 | { | 388 | { |
381 | struct rpc_auth *auth = task->tk_client->cl_auth; | 389 | struct rpc_auth *auth = task->tk_client->cl_auth; |
@@ -394,8 +402,8 @@ rpcauth_bind_root_cred(struct rpc_task *task) | |||
394 | task->tk_status = PTR_ERR(ret); | 402 | task->tk_status = PTR_ERR(ret); |
395 | } | 403 | } |
396 | 404 | ||
397 | void | 405 | static void |
398 | rpcauth_bindcred(struct rpc_task *task) | 406 | rpcauth_bind_new_cred(struct rpc_task *task) |
399 | { | 407 | { |
400 | struct rpc_auth *auth = task->tk_client->cl_auth; | 408 | struct rpc_auth *auth = task->tk_client->cl_auth; |
401 | struct rpc_cred *ret; | 409 | struct rpc_cred *ret; |
@@ -410,14 +418,14 @@ rpcauth_bindcred(struct rpc_task *task) | |||
410 | } | 418 | } |
411 | 419 | ||
412 | void | 420 | void |
413 | rpcauth_holdcred(struct rpc_task *task) | 421 | rpcauth_bindcred(struct rpc_task *task, struct rpc_cred *cred, int flags) |
414 | { | 422 | { |
415 | struct rpc_cred *cred = task->tk_msg.rpc_cred; | 423 | if (cred != NULL) |
416 | if (cred != NULL) { | 424 | rpcauth_generic_bind_cred(task, cred); |
417 | get_rpccred(cred); | 425 | else if (flags & RPC_TASK_ROOTCREDS) |
418 | dprintk("RPC: %5u holding %s cred %p\n", task->tk_pid, | 426 | rpcauth_bind_root_cred(task); |
419 | cred->cr_auth->au_ops->au_name, cred); | 427 | else |
420 | } | 428 | rpcauth_bind_new_cred(task); |
421 | } | 429 | } |
422 | 430 | ||
423 | void | 431 | void |
diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c index 7db956f6e018..6eab9bf94baf 100644 --- a/net/sunrpc/sched.c +++ b/net/sunrpc/sched.c | |||
@@ -817,14 +817,11 @@ static void rpc_init_task(struct rpc_task *task, const struct rpc_task_setup *ta | |||
817 | task->tk_action = rpc_prepare_task; | 817 | task->tk_action = rpc_prepare_task; |
818 | 818 | ||
819 | if (task_setup_data->rpc_message != NULL) { | 819 | if (task_setup_data->rpc_message != NULL) { |
820 | memcpy(&task->tk_msg, task_setup_data->rpc_message, sizeof(task->tk_msg)); | 820 | task->tk_msg.rpc_proc = task_setup_data->rpc_message->rpc_proc; |
821 | task->tk_msg.rpc_argp = task_setup_data->rpc_message->rpc_argp; | ||
822 | task->tk_msg.rpc_resp = task_setup_data->rpc_message->rpc_resp; | ||
821 | /* Bind the user cred */ | 823 | /* Bind the user cred */ |
822 | if (task->tk_msg.rpc_cred != NULL) | 824 | rpcauth_bindcred(task, task_setup_data->rpc_message->rpc_cred, task_setup_data->flags); |
823 | rpcauth_holdcred(task); | ||
824 | else if (!(task_setup_data->flags & RPC_TASK_ROOTCREDS)) | ||
825 | rpcauth_bindcred(task); | ||
826 | else | ||
827 | rpcauth_bind_root_cred(task); | ||
828 | if (task->tk_action == NULL) | 825 | if (task->tk_action == NULL) |
829 | rpc_call_start(task); | 826 | rpc_call_start(task); |
830 | } | 827 | } |