X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=kernel%2Fsched.c;h=3aaa5c8cb4214586bd283eedc2375baa3dc739c0;hb=aabdc3b8c3b3d081f1532454e344208338478e29;hp=b048ad8a11af1a2b1929ed074bbf3f8e6e81f856;hpb=ee5c2ab09b79d3aba3515a3eae7c5cf1e2cbc569;p=linux-2.6 diff --git a/kernel/sched.c b/kernel/sched.c index b048ad8a11..3aaa5c8cb4 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -4398,22 +4398,20 @@ do_wait_for_common(struct completion *x, long timeout, int state) signal_pending(current)) || (state == TASK_KILLABLE && fatal_signal_pending(current))) { - __remove_wait_queue(&x->wait, &wait); - return -ERESTARTSYS; + timeout = -ERESTARTSYS; + break; } __set_current_state(state); spin_unlock_irq(&x->wait.lock); timeout = schedule_timeout(timeout); spin_lock_irq(&x->wait.lock); - if (!timeout) { - __remove_wait_queue(&x->wait, &wait); - return timeout; - } - } while (!x->done); + } while (!x->done && timeout); __remove_wait_queue(&x->wait, &wait); + if (!x->done) + return timeout; } x->done--; - return timeout; + return timeout ?: 1; } static long __sched