forked from Minki/linux
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:
parent
85c7c70bc2
commit
ba32bd95d4
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user