Lock the media request for updating on QBUF IOCTL using
media_request_lock_for_update().

Signed-off-by: Sakari Ailus <[email protected]>
---
 drivers/media/common/videobuf2/videobuf2-v4l2.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/drivers/media/common/videobuf2/videobuf2-v4l2.c 
b/drivers/media/common/videobuf2/videobuf2-v4l2.c
index 0a68b19b40da7..8b390960ca671 100644
--- a/drivers/media/common/videobuf2/videobuf2-v4l2.c
+++ b/drivers/media/common/videobuf2/videobuf2-v4l2.c
@@ -398,12 +398,13 @@ static int vb2_queue_or_prepare_buf(struct vb2_queue *q, 
struct media_device *md
        if (IS_ERR(req)) {
                dprintk(1, "%s: invalid request_fd\n", opname);
                return PTR_ERR(req);
-       }
-
-       if (atomic_read(&req->state) != MEDIA_REQUEST_STATE_IDLE) {
-               dprintk(1, "%s: request is not idle\n", opname);
-               media_request_put(req);
-               return -EBUSY;
+       } else {
+               ret = media_request_lock_for_update(req);
+               if (ret) {
+                       media_request_put(req);
+                       dprintk(1, "%s: request %d busy\n", opname, 
b->request_fd);
+                       return PTR_ERR(req);
+               }
        }
 
        *p_req = req;
@@ -683,8 +684,10 @@ int vb2_qbuf(struct vb2_queue *q, struct media_device 
*mdev,
        if (ret)
                return ret;
        ret = vb2_core_qbuf(q, b->index, b, req);
-       if (req)
+       if (req) {
+               media_request_unlock_for_update(req);
                media_request_put(req);
+       }
        return ret;
 }
 EXPORT_SYMBOL_GPL(vb2_qbuf);
-- 
2.11.0

Reply via email to