From c61011aea759e1dce38893e3de187f428e999ef2 Mon Sep 17 00:00:00 2001 From: Trond Myklebust Date: Wed, 6 Jul 2011 19:58:23 -0400 Subject: [PATCH] --- yaml --- r: 254913 b: refs/heads/master c: b55c59892e1f3b6c7d4b9ccffb4263e1486fb990 h: refs/heads/master i: 254911: 491319eb700c2722e00724e92416d1b0ceba4f59 v: v3 --- [refs] | 2 +- trunk/net/sunrpc/sched.c | 27 +++++++++++---------------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/[refs] b/[refs] index fb57b797f20c..a681b3258ed9 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 2bea038c52e88badbbd5b420c1de918f7f2579e9 +refs/heads/master: b55c59892e1f3b6c7d4b9ccffb4263e1486fb990 diff --git a/trunk/net/sunrpc/sched.c b/trunk/net/sunrpc/sched.c index a27406b1654f..4814e246a874 100644 --- a/trunk/net/sunrpc/sched.c +++ b/trunk/net/sunrpc/sched.c @@ -616,30 +616,25 @@ static void __rpc_execute(struct rpc_task *task) BUG_ON(RPC_IS_QUEUED(task)); for (;;) { + void (*do_action)(struct rpc_task *); /* - * Execute any pending callback. + * Execute any pending callback first. */ - if (task->tk_callback) { - void (*save_callback)(struct rpc_task *); - - /* - * We set tk_callback to NULL before calling it, - * in case it sets the tk_callback field itself: - */ - save_callback = task->tk_callback; - task->tk_callback = NULL; - save_callback(task); - } else { + do_action = task->tk_callback; + task->tk_callback = NULL; + if (do_action == NULL) { /* * Perform the next FSM step. - * tk_action may be NULL when the task has been killed - * by someone else. + * tk_action may be NULL if the task has been killed. + * In particular, note that rpc_killall_tasks may + * do this at any time, so beware when dereferencing. */ - if (task->tk_action == NULL) + do_action = task->tk_action; + if (do_action == NULL) break; - task->tk_action(task); } + do_action(task); /* * Lockless check for whether task is sleeping or not.