summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrandon Philips <brandon@ifup.org>2008-04-02 11:10:59 -0700
committerBrandon Philips <brandon@ifup.org>2008-04-02 11:10:59 -0700
commit0a77d984a1bf348ffe5876173a820fedf64c5be1 (patch)
tree75c152f81b6160e6afa16c71dd1ff485b668d205
parent12d05113a10be2078e72039a301b3d3902d29248 (diff)
downloadmediapointer-dvb-s2-0a77d984a1bf348ffe5876173a820fedf64c5be1.tar.gz
mediapointer-dvb-s2-0a77d984a1bf348ffe5876173a820fedf64c5be1.tar.bz2
vivi: make vivi openable only once
vivi currently doesn't have the infrastructure to handle being opened more than one time and will crash if it is. So, make it openable only once. Signed-off-by: Brandon Philips <bphilips@suse.de> --- linux/drivers/media/video/vivi.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-)
-rw-r--r--linux/drivers/media/video/vivi.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/linux/drivers/media/video/vivi.c b/linux/drivers/media/video/vivi.c
index 9a168917f..f245cdfe7 100644
--- a/linux/drivers/media/video/vivi.c
+++ b/linux/drivers/media/video/vivi.c
@@ -181,6 +181,7 @@ struct vivi_dev {
struct semaphore lock;
#endif
spinlock_t slock;
+ struct mutex mutex;
int users;
@@ -1110,6 +1111,7 @@ static int vivi_open(struct inode *inode, struct file *file)
struct vivi_dev *dev;
struct vivi_fh *fh;
int i;
+ int retval = 0;
printk(KERN_DEBUG "vivi: open called (minor=%d)\n", minor);
@@ -1119,9 +1121,15 @@ static int vivi_open(struct inode *inode, struct file *file)
return -ENODEV;
found:
- /* If more than one user, mutex should be added */
+ mutex_lock(&dev->mutex);
dev->users++;
+ if (dev->users > 1) {
+ dev->users--;
+ retval = -EBUSY;
+ goto unlock;
+ }
+
dprintk(dev, 1, "open minor=%d type=%s users=%d\n", minor,
v4l2_type_names[V4L2_BUF_TYPE_VIDEO_CAPTURE], dev->users);
@@ -1129,8 +1137,13 @@ found:
fh = kzalloc(sizeof(*fh), GFP_KERNEL);
if (NULL == fh) {
dev->users--;
- return -ENOMEM;
+ retval = -ENOMEM;
+ goto unlock;
}
+unlock:
+ mutex_unlock(&dev->mutex);
+ if (retval)
+ return retval;
file->private_data = fh;
fh->dev = dev;
@@ -1202,7 +1215,9 @@ static int vivi_close(struct inode *inode, struct file *file)
kfree(fh);
+ mutex_lock(&dev->mutex);
dev->users--;
+ mutex_unlock(&dev->mutex);
dprintk(dev, 1, "close called (minor=%d, users=%d)\n",
minor, dev->users);
@@ -1319,6 +1334,7 @@ static int __init vivi_init(void)
/* initialize locks */
mutex_init(&dev->lock);
spin_lock_init(&dev->slock);
+ mutex_init(&dev->mutex);
dev->vidq.timeout.function = vivi_vid_timeout;
dev->vidq.timeout.data = (unsigned long)dev;