Skip to content

Commit

Permalink
V4L/DVB (7491): vivi: make vivi openable only once
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Mauro Carvalho Chehab <[email protected]>
  • Loading branch information
philips authored and mchehab committed Apr 24, 2008
1 parent cbcb565 commit aa9dbac
Showing 1 changed file with 18 additions and 2 deletions.
20 changes: 18 additions & 2 deletions drivers/media/video/vivi.c
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,7 @@ struct vivi_dev {

struct mutex lock;
spinlock_t slock;
struct mutex mutex;

int users;

Expand Down Expand Up @@ -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);

Expand All @@ -1045,18 +1047,29 @@ 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);

/* allocate + initialize per filehandle data */
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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit aa9dbac

Please sign in to comment.