media: vb2: set owner before calling vb2_read
authorHans Verkuil <hverkuil-cisco@xs4all.nl>
Wed, 1 Feb 2023 13:06:47 +0000 (14:06 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Sun, 19 Mar 2023 21:09:55 +0000 (22:09 +0100)
Before vb2_read is called, the owner must be set since vb2_read will
actually start streaming. If vb2_read returns an error and q->fileio is
NULL, then it failed to start streaming and the owner is set back to NULL.

When the vb2 start_streaming callback is called, it expects the owner
pointer to be set, and that wasn't the case in this particular situation.

Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/common/videobuf2/videobuf2-v4l2.c

index 1f5d235..c7a54d8 100644 (file)
@@ -1171,10 +1171,11 @@ ssize_t vb2_fop_read(struct file *file, char __user *buf,
                return -ERESTARTSYS;
        if (vb2_queue_is_busy(vdev->queue, file))
                goto exit;
+       vdev->queue->owner = file->private_data;
        err = vb2_read(vdev->queue, buf, count, ppos,
                       file->f_flags & O_NONBLOCK);
-       if (vdev->queue->fileio)
-               vdev->queue->owner = file->private_data;
+       if (!vdev->queue->fileio)
+               vdev->queue->owner = NULL;
 exit:
        if (lock)
                mutex_unlock(lock);