25-akpm/drivers/media/video/video-buf.c |   10 ++++++----
 1 files changed, 6 insertions(+), 4 deletions(-)

diff -puN drivers/media/video/video-buf.c~videobuf_waiton-race-fix drivers/media/video/video-buf.c
--- 25/drivers/media/video/video-buf.c~videobuf_waiton-race-fix	Mon Oct 20 13:04:00 2003
+++ 25-akpm/drivers/media/video/video-buf.c	Mon Oct 20 16:06:11 2003
@@ -320,14 +320,16 @@ int videobuf_waiton(struct videobuf_buff
 	DECLARE_WAITQUEUE(wait, current);
 	
 	add_wait_queue(&vb->done, &wait);
-	while (vb->state == STATE_ACTIVE ||
-	       vb->state == STATE_QUEUED) {
+	while (vb->state == STATE_ACTIVE || vb->state == STATE_QUEUED) {
 		if (non_blocking) {
 			retval = -EAGAIN;
 			break;
 		}
-		current->state = intr ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE;
-		schedule();
+		set_current_state(intr ? TASK_INTERRUPTIBLE :
+					TASK_UNINTERRUPTIBLE);
+		if (vb->state == STATE_ACTIVE || vb->state == STATE_QUEUED)
+			schedule();
+		set_current_state(TASK_RUNNING);
 		if (intr && signal_pending(current)) {
 			dprintk(1,"buffer waiton: -EINTR\n");
 			retval = -EINTR;

_