summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrandon Philips <brandon@ifup.org>2008-04-02 18:10:59 -0300
committerMauro Carvalho Chehab <mchehab@infradead.org>2008-04-24 14:07:57 -0300
commitaa9dbac426d263b5b86d1684993d18ae187d7588 (patch)
tree942a7399e4ea9e2c135d71008461dbd5c3cd11bf
parentcbcb565f74cf01d680f83af531490bb2c5375af0 (diff)
downloadop-kernel-dev-aa9dbac426d263b5b86d1684993d18ae187d7588.zip
op-kernel-dev-aa9dbac426d263b5b86d1684993d18ae187d7588.tar.gz
V4L/DVB (7491): 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> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
-rw-r--r--drivers/media/video/vivi.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/drivers/media/video/vivi.c b/drivers/media/video/vivi.c
index 0e62317..02a2327 100644
--- a/drivers/media/video/vivi.c
+++ b/drivers/media/video/vivi.c
@@ -164,6 +164,7 @@ struct vivi_dev {
struct mutex lock;
spinlock_t slock;
+ struct mutex mutex;
int users;
@@ -1036,6 +1037,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);
@@ -1045,9 +1047,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);
@@ -1055,8 +1063,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;
@@ -1128,7 +1141,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);
@@ -1243,6 +1258,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;
OpenPOWER on IntegriCloud