V4L/DVB (8505): saa7134-empress.c: fix deadlock

Previous thread: V4L/DVB (8502): videodev2.h: CodingStyle cleanups by Linux Kernel Mailing List on Monday, July 28, 2008 - 10:03 am. (1 message)

Next thread: V4L/DVB (8509): pvrusb2: fix device descriptions for HVR-1900 & HVR-1950 by Linux Kernel Mailing List on Monday, July 28, 2008 - 10:03 am. (1 message)
From: Linux Kernel Mailing List
Date: Monday, July 28, 2008 - 10:03 am

Gitweb:     http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=1052ef...
Commit:     1052efe0fc69130d9d6a44bc9ceecd229221d9a1
Parent:     feb75f07102a85026d41e2c4e4113c34dd035c30
Author:     Hans Verkuil <hverkuil@xs4all.nl>
AuthorDate: Sat Jul 26 09:01:24 2008 -0300
Committer:  Mauro Carvalho Chehab <mchehab@infradead.org>
CommitDate: Sun Jul 27 11:06:23 2008 -0300

    V4L/DVB (8505): saa7134-empress.c: fix deadlock
    
    ts_release() locked a mutex that videobuf_stop() also tried to obtain.
    But ts_release() shouldn't hold that mutex at all.
    
    Make empress_users atomic as well to prevent possible race condition.
    
    Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
---
 drivers/media/video/saa7134/saa7134-empress.c |   12 ++++--------
 drivers/media/video/saa7134/saa7134.h         |    2 +-
 2 files changed, 5 insertions(+), 9 deletions(-)

diff --git a/drivers/media/video/saa7134/saa7134-empress.c b/drivers/media/video/saa7134/saa7134-empress.c
index 8b3f951..2ecfbd1 100644
--- a/drivers/media/video/saa7134/saa7134-empress.c
+++ b/drivers/media/video/saa7134/saa7134-empress.c
@@ -89,14 +89,14 @@ static int ts_open(struct inode *inode, struct file *file)
 	err = -EBUSY;
 	if (!mutex_trylock(&dev->empress_tsq.vb_lock))
 		goto done;
-	if (dev->empress_users)
+	if (atomic_read(&dev->empress_users))
 		goto done_up;
 
 	/* Unmute audio */
 	saa_writeb(SAA7134_AUDIO_MUTE_CTRL,
 		saa_readb(SAA7134_AUDIO_MUTE_CTRL) & ~(1 << 6));
 
-	dev->empress_users++;
+	atomic_inc(&dev->empress_users);
 	file->private_data = dev;
 	err = 0;
 
@@ -110,8 +110,6 @@ static int ts_release(struct inode *inode, struct file *file)
 {
 	struct saa7134_dev *dev = file->private_data;
 
-	mutex_lock(&dev->empress_tsq.vb_lock);
-
 	videobuf_stop(&dev->empress_tsq);
 	videobuf_mmap_free(&dev->empress_tsq);
 
@@ -122,9 +120,7 @@ static int ...
Previous thread: V4L/DVB (8502): videodev2.h: CodingStyle cleanups by Linux Kernel Mailing List on Monday, July 28, 2008 - 10:03 am. (1 message)

Next thread: V4L/DVB (8509): pvrusb2: fix device descriptions for HVR-1900 & HVR-1950 by Linux Kernel Mailing List on Monday, July 28, 2008 - 10:03 am. (1 message)