V4L/DVB (6275): V4L: vivi.c remove the "resource" locking
authorBrandon Philips <bphilips@suse.de>
Thu, 27 Sep 2007 23:55:17 +0000 (20:55 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Wed, 10 Oct 2007 03:03:05 +0000 (00:03 -0300)
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>
drivers/media/video/vivi.c

index cdef622f6b3279cbd1197ccf8d6596a4d8de47dc..82755091648b56618d8971c740ed5ad6934f2c4e 100644 (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);
        }