[media] vb2: properly clean up PREPARED and QUEUED buffers
authorHans Verkuil <hans.verkuil@cisco.com>
Fri, 28 Feb 2014 15:49:18 +0000 (12:49 -0300)
committerMauro Carvalho Chehab <m.chehab@samsung.com>
Tue, 11 Mar 2014 09:56:42 +0000 (06:56 -0300)
If __reqbufs was called then existing buffers are freed. However, if that
happens without ever having started STREAMON, but if buffers have been queued,
then the buf_finish op is never called.

Add a call to __vb2_queue_cancel in __reqbufs so that these buffers are
cleaned up there as well.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
drivers/media/v4l2-core/videobuf2-core.c

index ce308f6d20953e73c793f2a76f1e97eaee429ac2..17f1d071739ccd5c260287d92a690f97466560b3 100644 (file)
@@ -100,6 +100,8 @@ module_param(debug, int, 0644);
 #define V4L2_BUFFER_OUT_FLAGS  (V4L2_BUF_FLAG_PFRAME | V4L2_BUF_FLAG_BFRAME | \
                                 V4L2_BUF_FLAG_KEYFRAME | V4L2_BUF_FLAG_TIMECODE)
 
+static void __vb2_queue_cancel(struct vb2_queue *q);
+
 /**
  * __vb2_buf_mem_alloc() - allocate video memory for the given buffer
  */
@@ -802,6 +804,12 @@ static int __reqbufs(struct vb2_queue *q, struct v4l2_requestbuffers *req)
                        return -EBUSY;
                }
 
+               /*
+                * Call queue_cancel to clean up any buffers in the PREPARED or
+                * QUEUED state which is possible if buffers were prepared or
+                * queued without ever calling STREAMON.
+                */
+               __vb2_queue_cancel(q);
                ret = __vb2_queue_free(q, q->num_buffers);
                if (ret)
                        return ret;