Minor fix-ups to videobuf_cgmbuf locking.  

e9hack, could you test this and the next patch on your hardware? Thanks.

Not fully tested, v4l1-compat doesn't work with the vivi driver!
videobuf-vmalloc.c needs fixing. 

Signed-off-by: Brandon Philips <[EMAIL PROTECTED]>
---

diff --git a/linux/drivers/media/video/videobuf-core.c 
b/linux/drivers/media/video/videobuf-core.c
--- a/linux/drivers/media/video/videobuf-core.c
+++ b/linux/drivers/media/video/videobuf-core.c
@@ -377,7 +377,7 @@ int videobuf_mmap_setup(struct videobuf_
        return ret;
 }
 
-int videobuf_reqbufs(struct videobuf_queue *q,
+static int __videobuf_reqbufs(struct videobuf_queue *q,
                 struct v4l2_requestbuffers *req)
 {
        unsigned int size,count;
@@ -395,22 +395,18 @@ int videobuf_reqbufs(struct videobuf_que
                return -EINVAL;
        }
 
-       mutex_lock(&q->lock);
        if (req->type != q->type) {
                dprintk(1,"reqbufs: queue type invalid\n");
-               retval = -EINVAL;
-               goto done;
+               return -EINVAL;
        }
 
        if (q->streaming) {
                dprintk(1,"reqbufs: streaming already exists\n");
-               retval = -EBUSY;
-               goto done;
+               return -EBUSY;
        }
        if (!list_empty(&q->stream)) {
                dprintk(1,"reqbufs: stream running\n");
-               retval = -EBUSY;
-               goto done;
+               return -EBUSY;
        }
 
        count = req->count;
@@ -425,14 +421,22 @@ int videobuf_reqbufs(struct videobuf_que
        retval = __videobuf_mmap_setup(q,count,size,req->memory);
        if (retval < 0) {
                dprintk(1,"reqbufs: mmap setup returned %d\n",retval);
-               goto done;
+               return retval;
        }
 
        req->count = retval;
 
- done:
-       mutex_unlock(&q->lock);
        return retval;
+}
+
+int videobuf_reqbufs(struct videobuf_queue *q,
+                struct v4l2_requestbuffers *req)
+{
+       int retval;
+       mutex_lock(&q->lock);
+       retval = __videobuf_reqbufs(q, req);
+       mutex_unlock(&q->lock);
+       return retval;
 }
 
 int videobuf_querybuf(struct videobuf_queue *q, struct v4l2_buffer *b)
@@ -1032,12 +1036,15 @@ int videobuf_cgmbuf(struct videobuf_queu
        MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
 
        memset(&req,0,sizeof(req));
+       mutex_lock(&q->lock);
        req.type   = q->type;
        req.count  = count;
        req.memory = V4L2_MEMORY_MMAP;
-       rc = videobuf_reqbufs(q,&req);
-       if (rc < 0)
+       rc = __videobuf_reqbufs(q,&req);
+       if (rc < 0) {
+               mutex_unlock(&q->lock);
                return rc;
+       }
 
        mbuf->frames = req.count;
        mbuf->size   = 0;
@@ -1046,6 +1053,7 @@ int videobuf_cgmbuf(struct videobuf_queu
                mbuf->size       += q->bufs[i]->bsize;
        }
 
+       mutex_unlock(&q->lock);
        return 0;
 }
 EXPORT_SYMBOL_GPL(videobuf_cgmbuf);

_______________________________________________
linux-dvb mailing list
linux-dvb@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

Reply via email to