
From: Stelian Pop <stelian@popies.net>

Signed-off-by: Stelian Pop <stelian@popies.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 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;
 	}
 
_
