aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc/clnt.c
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2007-10-25 18:19:37 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2008-01-30 02:05:31 -0500
commit5085925902cc4d93b9a4992936edd2aee70a5e15 (patch)
tree4d938ccdf4a32ef9c66d005d96dacb4cfb744216 /net/sunrpc/clnt.c
parent3ff7576ddac06c3d07089e241b40826d24bbf1ac (diff)
SUNRPC: Mask signals across the call to rpc_call_setup() in rpc_run_task
To ensure that the RPCSEC_GSS upcall is performed with the correct sigmask. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'net/sunrpc/clnt.c')
-rw-r--r--net/sunrpc/clnt.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
index 9aad45946d32..aefe3ae218f7 100644
--- a/net/sunrpc/clnt.c
+++ b/net/sunrpc/clnt.c
@@ -501,12 +501,12 @@ static void rpc_save_sigmask(sigset_t *oldset, int intr)
501 sigprocmask(SIG_BLOCK, &sigmask, oldset); 501 sigprocmask(SIG_BLOCK, &sigmask, oldset);
502} 502}
503 503
504static inline void rpc_task_sigmask(struct rpc_task *task, sigset_t *oldset) 504static void rpc_task_sigmask(struct rpc_task *task, sigset_t *oldset)
505{ 505{
506 rpc_save_sigmask(oldset, !RPC_TASK_UNINTERRUPTIBLE(task)); 506 rpc_save_sigmask(oldset, !RPC_TASK_UNINTERRUPTIBLE(task));
507} 507}
508 508
509static inline void rpc_restore_sigmask(sigset_t *oldset) 509static void rpc_restore_sigmask(sigset_t *oldset)
510{ 510{
511 sigprocmask(SIG_SETMASK, oldset, NULL); 511 sigprocmask(SIG_SETMASK, oldset, NULL);
512} 512}
@@ -536,11 +536,10 @@ struct rpc_task *rpc_run_task(const struct rpc_task_setup *task_setup_data)
536 if (task == NULL) { 536 if (task == NULL) {
537 rpc_release_calldata(task_setup_data->callback_ops, 537 rpc_release_calldata(task_setup_data->callback_ops,
538 task_setup_data->callback_data); 538 task_setup_data->callback_data);
539 return ERR_PTR(-ENOMEM); 539 ret = ERR_PTR(-ENOMEM);
540 goto out;
540 } 541 }
541 542
542 /* Mask signals on synchronous RPC calls and RPCSEC_GSS upcalls */
543 rpc_task_sigmask(task, &oldset);
544 if (task_setup_data->rpc_message != NULL) { 543 if (task_setup_data->rpc_message != NULL) {
545 rpc_call_setup(task, task_setup_data->rpc_message, 0); 544 rpc_call_setup(task, task_setup_data->rpc_message, 0);
546 if (task->tk_status != 0) { 545 if (task->tk_status != 0) {
@@ -550,10 +549,12 @@ struct rpc_task *rpc_run_task(const struct rpc_task_setup *task_setup_data)
550 } 549 }
551 } 550 }
552 atomic_inc(&task->tk_count); 551 atomic_inc(&task->tk_count);
552 /* Mask signals on synchronous RPC calls and RPCSEC_GSS upcalls */
553 rpc_task_sigmask(task, &oldset);
553 rpc_execute(task); 554 rpc_execute(task);
555 rpc_restore_sigmask(&oldset);
554 ret = task; 556 ret = task;
555out: 557out:
556 rpc_restore_sigmask(&oldset);
557 return ret; 558 return ret;
558} 559}
559EXPORT_SYMBOL_GPL(rpc_run_task); 560EXPORT_SYMBOL_GPL(rpc_run_task);