summary refs log tree commit diff
path: root/kernel/sched.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2008-06-25 12:27:05 +0200
committerIngo Molnar <mingo@elte.hu>2008-06-25 12:27:05 +0200
commit773dc8eacaedb2e8c8d0defb5de2c66ea7dc4a08 (patch)
tree1bfa945dcfbcc4a60e31714f768ef38155c621d3 /kernel/sched.c
parent961ccddd59d627b89bd3dc284b6517833bbdf25d (diff)
parent543cf4cb3fe6f6cae3651ba918b9c56200b257d0 (diff)
downloadlinux-773dc8eacaedb2e8c8d0defb5de2c66ea7dc4a08.tar.gz
Merge branch 'linus' into sched/new-API-sched_setscheduler
Diffstat (limited to 'kernel/sched.c')
-rw-r--r--kernel/sched.c14
1 files changed, 6 insertions, 8 deletions
diff --git a/kernel/sched.c b/kernel/sched.c
index 8d7c246ab864..7c0e7063c11f 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