From: Mike Waychison Fix up signal_pending and timeout paths for wait_for_completion API extensions. Signed-off-by: Mike Waychison Signed-off-by: Andrew Morton --- 25-akpm/kernel/sched.c | 21 +++++++++++++-------- 1 files changed, 13 insertions(+), 8 deletions(-) diff -puN kernel/sched.c~wait_for_completion-api-extension-addition-fixes kernel/sched.c --- 25/kernel/sched.c~wait_for_completion-api-extension-addition-fixes 2005-01-25 22:15:52.094234544 -0800 +++ 25-akpm/kernel/sched.c 2005-01-25 22:15:52.101233480 -0800 @@ -3020,15 +3020,17 @@ wait_for_completion_timeout(struct compl __set_current_state(TASK_UNINTERRUPTIBLE); spin_unlock_irq(&x->wait.lock); timeout = schedule_timeout(timeout); - if (!timeout) - goto out; spin_lock_irq(&x->wait.lock); + if (!timeout) { + __remove_wait_queue(&x->wait, &wait); + goto out; + } } while (!x->done); __remove_wait_queue(&x->wait, &wait); } x->done--; - spin_unlock_irq(&x->wait.lock); out: + spin_unlock_irq(&x->wait.lock); return timeout; } EXPORT_SYMBOL(wait_for_completion_timeout); @@ -3048,6 +3050,7 @@ int fastcall __sched wait_for_completion do { if (signal_pending(current)) { ret = -ERESTARTSYS; + __remove_wait_queue(&x->wait, &wait); goto out; } __set_current_state(TASK_INTERRUPTIBLE); @@ -3080,21 +3083,23 @@ wait_for_completion_interruptible_timeou do { if (signal_pending(current)) { timeout = -ERESTARTSYS; - goto out_unlock; + __remove_wait_queue(&x->wait, &wait); + goto out; } __set_current_state(TASK_INTERRUPTIBLE); spin_unlock_irq(&x->wait.lock); timeout = schedule_timeout(timeout); - if (!timeout) - goto out; spin_lock_irq(&x->wait.lock); + if (!timeout) { + __remove_wait_queue(&x->wait, &wait); + goto out; + } } while (!x->done); __remove_wait_queue(&x->wait, &wait); } x->done--; -out_unlock: - spin_unlock_irq(&x->wait.lock); out: + spin_unlock_irq(&x->wait.lock); return timeout; } EXPORT_SYMBOL(wait_for_completion_interruptible_timeout); _