V4L/DVB (6275): V4L: vivi.c remove the "resource" locking

The "resource" locking in vivi isn't needed since
streamon/streamoff/read_stream do mutual exclusion using
q->reading/q->streaming.

Plus it is sort of broken:

a) res_locked() use in vivi_read() is racey.
b) res_free() calls mutex_lock twice causing streamoff to break

Signed-off-by: Brandon Philips <bphilips@suse.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
Brandon Philips 2007-09-27 20:55:17 -03:00 committed by Mauro Carvalho Chehab
parent 85c7c70bc2
commit ba32bd95d4

View File

@ -170,7 +170,6 @@ struct vivi_dev {
int users;
/* various device info */
unsigned int resources;
struct video_device vfd;
struct vivi_dmaqueue vidq;
@ -726,40 +725,6 @@ static struct videobuf_queue_ops vivi_video_qops = {
.buf_release = buffer_release,
};
/* ------------------------------------------------------------------
IOCTL handling
------------------------------------------------------------------*/
static int res_get(struct vivi_dev *dev, struct vivi_fh *fh)
{
/* is it free? */
mutex_lock(&dev->lock);
if (dev->resources) {
/* no, someone else uses it */
mutex_unlock(&dev->lock);
return 0;
}
/* it's free, grab it */
dev->resources =1;
dprintk(1,"res: get\n");
mutex_unlock(&dev->lock);
return 1;
}
static int res_locked(struct vivi_dev *dev)
{
return (dev->resources);
}
static void res_free(struct vivi_dev *dev, struct vivi_fh *fh)
{
mutex_lock(&dev->lock);
dev->resources = 0;
dprintk(1,"res: put\n");
mutex_lock(&dev->lock);
}
/* ------------------------------------------------------------------
IOCTL vidioc handling
------------------------------------------------------------------*/
@ -913,9 +878,7 @@ static int vidioc_streamon(struct file *file, void *priv, enum v4l2_buf_type i)
if (i != fh->type)
return -EINVAL;
if (!res_get(dev,fh))
return -EBUSY;
return (videobuf_streamon(&fh->vb_vidq));
return videobuf_streamon(&fh->vb_vidq);
}
static int vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type i)
@ -928,10 +891,7 @@ static int vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type i)
if (i != fh->type)
return -EINVAL;
videobuf_streamoff(&fh->vb_vidq);
res_free(dev,fh);
return (0);
return videobuf_streamoff(&fh->vb_vidq);
}
static int vidioc_s_std (struct file *file, void *priv, v4l2_std_id *i)
@ -1096,10 +1056,10 @@ static ssize_t
vivi_read(struct file *file, char __user *data, size_t count, loff_t *ppos)
{
struct vivi_fh *fh = file->private_data;
struct vivi_dev *dev = fh->dev;
struct videobuf_queue *q = &fh->vb_vidq;
if (fh->type==V4L2_BUF_TYPE_VIDEO_CAPTURE) {
if (res_locked(fh->dev))
return -EBUSY;
return videobuf_read_stream(&fh->vb_vidq, data, count, ppos, 0,
file->f_flags & O_NONBLOCK);
}