Upgrade to 4.4.50-rt62
[kvmfornfv.git] / kernel / drivers / media / v4l2-core / videobuf2-core.c
index 33bdd81..47f3768 100644 (file)
@@ -1502,10 +1502,10 @@ static int __vb2_wait_for_done_vb(struct vb2_queue *q, int nonblocking)
  * Will sleep if required for nonblocking == false.
  */
 static int __vb2_get_done_vb(struct vb2_queue *q, struct vb2_buffer **vb,
-                               int nonblocking)
+                            void *pb, int nonblocking)
 {
        unsigned long flags;
-       int ret;
+       int ret = 0;
 
        /*
         * Wait for at least one buffer to become available on the done_list.
@@ -1521,12 +1521,14 @@ static int __vb2_get_done_vb(struct vb2_queue *q, struct vb2_buffer **vb,
        spin_lock_irqsave(&q->done_lock, flags);
        *vb = list_first_entry(&q->done_list, struct vb2_buffer, done_entry);
        /*
-        * Only remove the buffer from done_list if v4l2_buffer can handle all
-        * the planes.
-        * Verifying planes is NOT necessary since it already has been checked
-        * before the buffer is queued/prepared. So it can never fail.
+        * Only remove the buffer from done_list if all planes can be
+        * handled. Some cases such as V4L2 file I/O and DVB have pb
+        * == NULL; skip the check then as there's nothing to verify.
         */
-       list_del(&(*vb)->done_entry);
+       if (pb)
+               ret = call_bufop(q, verify_planes_array, *vb, pb);
+       if (!ret)
+               list_del(&(*vb)->done_entry);
        spin_unlock_irqrestore(&q->done_lock, flags);
 
        return ret;
@@ -1604,7 +1606,7 @@ int vb2_core_dqbuf(struct vb2_queue *q, void *pb, bool nonblocking)
        struct vb2_buffer *vb = NULL;
        int ret;
 
-       ret = __vb2_get_done_vb(q, &vb, nonblocking);
+       ret = __vb2_get_done_vb(q, &vb, pb, nonblocking);
        if (ret < 0)
                return ret;