From d4680c6fba476f221cb3ea81075d981fabe6a3d2 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Tue, 18 Nov 2003 08:14:33 -0800 Subject: [PATCH] [PATCH] videobuf_waiton race fix There's a window in this function where a wakeup can get lost. --- drivers/media/video/video-buf.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/media/video/video-buf.c b/drivers/media/video/video-buf.c index 0435a6050100e..5afc77fabfa1b 100644 --- a/drivers/media/video/video-buf.c +++ b/drivers/media/video/video-buf.c @@ -320,14 +320,16 @@ int videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr) 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; -- 2.53.0