From: Stelian Pop Signed-off-by: Stelian Pop Signed-off-by: Andrew Morton --- 25-akpm/drivers/media/video/meye.c | 15 +++++++++++++-- 1 files changed, 13 insertions(+), 2 deletions(-) diff -puN drivers/media/video/meye.c~meye-do-lock-properly-when-waiting-for-buffers drivers/media/video/meye.c --- 25/drivers/media/video/meye.c~meye-do-lock-properly-when-waiting-for-buffers Thu Nov 4 15:04:37 2004 +++ 25-akpm/drivers/media/video/meye.c Thu Nov 4 15:04:37 2004 @@ -929,19 +929,25 @@ static int meye_do_ioctl(struct inode *i if (*i < 0 || *i >= gbuffers) return -EINVAL; + down(&meye.lock); + switch (meye.grab_buffer[*i].state) { case MEYE_BUF_UNUSED: + up(&meye.lock); return -EINVAL; case MEYE_BUF_USING: if (wait_event_interruptible(meye.proc_list, - (meye.grab_buffer[*i].state != MEYE_BUF_USING))) + (meye.grab_buffer[*i].state != MEYE_BUF_USING))) { + up(&meye.lock); return -EINTR; + } /* fall through */ case MEYE_BUF_DONE: meye.grab_buffer[*i].state = MEYE_BUF_UNUSED; kfifo_get(meye.doneq, (unsigned char *)&unused, sizeof(int)); } + up(&meye.lock); break; } @@ -1059,20 +1065,25 @@ static int meye_do_ioctl(struct inode *i if (*i < 0 || *i >= gbuffers) return -EINVAL; + down(&meye.lock); switch (meye.grab_buffer[*i].state) { case MEYE_BUF_UNUSED: + up(&meye.lock); return -EINVAL; case MEYE_BUF_USING: if (wait_event_interruptible(meye.proc_list, - (meye.grab_buffer[*i].state != MEYE_BUF_USING))) + (meye.grab_buffer[*i].state != MEYE_BUF_USING))) { + up(&meye.lock); return -EINTR; + } /* fall through */ case MEYE_BUF_DONE: meye.grab_buffer[*i].state = MEYE_BUF_UNUSED; kfifo_get(meye.doneq, (unsigned char *)&unused, sizeof(int)); } *i = meye.grab_buffer[*i].size; + up(&meye.lock); break; } _