--- ./include/linux/sunrpc/sched.h.ORG 2005-05-24 10:29:24.000000000 -0400 +++ ./include/linux/sunrpc/sched.h 2005-05-24 10:47:56.000000000 -0400 @@ -142,7 +142,6 @@ typedef void (*rpc_action)(struct rpc_ #define RPC_TASK_RUNNING 0 #define RPC_TASK_QUEUED 1 #define RPC_TASK_WAKEUP 2 -#define RPC_TASK_HAS_TIMER 3 #define RPC_IS_RUNNING(t) (test_bit(RPC_TASK_RUNNING, &(t)->tk_runstate)) #define rpc_set_running(t) (set_bit(RPC_TASK_RUNNING, &(t)->tk_runstate)) ================================================================= --- ./net/sunrpc/sched.c.ORG 2005-05-24 10:29:52.000000000 -0400 +++ ./net/sunrpc/sched.c 2005-05-27 18:27:41.000000000 -0400 @@ -103,9 +103,6 @@ static void rpc_run_timer(struct rpc_tas dprintk("RPC: %4d running timer\n", task->tk_pid); callback(task); } - smp_mb__before_clear_bit(); - clear_bit(RPC_TASK_HAS_TIMER, &task->tk_runstate); - smp_mb__after_clear_bit(); } /* @@ -124,7 +121,6 @@ __rpc_add_timer(struct rpc_task *task, r task->tk_timeout_fn = timer; else task->tk_timeout_fn = __rpc_default_timer; - set_bit(RPC_TASK_HAS_TIMER, &task->tk_runstate); mod_timer(&task->tk_timer, jiffies + task->tk_timeout); } @@ -135,7 +131,7 @@ __rpc_add_timer(struct rpc_task *task, r static inline void rpc_delete_timer(struct rpc_task *task) { - if (test_and_clear_bit(RPC_TASK_HAS_TIMER, &task->tk_runstate)) { + if (timer_pending(&task->tk_timer)) { del_singleshot_timer_sync(&task->tk_timer); dprintk("RPC: %4d deleting timer\n", task->tk_pid); } @@ -849,6 +845,7 @@ void rpc_release_task(struct rpc_task *t task->tk_active = 0; /* Synchronously delete any running timer */ + task->tk_timeout = 0; rpc_delete_timer(task); /* Release resources */