media: media requests: return EBADR instead of EACCES
authorHans Verkuil <hverkuil-cisco@xs4all.nl>
Wed, 20 Mar 2019 14:31:18 +0000 (10:31 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Mon, 25 Mar 2019 17:26:10 +0000 (13:26 -0400)
If requests are used when they shouldn't, or not used when they should,
then return EBADR (Invalid request descriptor) instead of EACCES.

The reason for this change is that EACCES has more to do with permissions
(not being the owner of the resource), but in this case the request file
descriptor is just wrong for the current mode of the device.

Update the documentation accordingly.

Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
Documentation/media/uapi/mediactl/request-api.rst
Documentation/media/uapi/v4l/buffer.rst
Documentation/media/uapi/v4l/vidioc-qbuf.rst
drivers/media/common/videobuf2/videobuf2-v4l2.c
drivers/media/media-request.c
include/media/media-request.h

index 1ad631e549fe7e50e9e4df3c6d322aae607fcedb..a74c82d95609e4bdd6c91bffb17a5b08f2bbb490 100644 (file)
@@ -93,7 +93,7 @@ A queued request cannot be modified anymore.
 .. caution::
    For :ref:`memory-to-memory devices <mem2mem>` you can use requests only for
    output buffers, not for capture buffers. Attempting to add a capture buffer
-   to a request will result in an ``EACCES`` error.
+   to a request will result in an ``EBADR`` error.
 
 If the request contains configurations for multiple entities, individual drivers
 may synchronize so the requested pipeline's topology is applied before the
index 81ffdcb89057c0ae97980969b7cf3183f5340d7c..b9a2e9dc707c8fb6b0f88e390bf9418f74a01d7e 100644 (file)
@@ -326,7 +326,7 @@ struct v4l2_buffer
        Applications should not set ``V4L2_BUF_FLAG_REQUEST_FD`` for any ioctls
        other than :ref:`VIDIOC_QBUF <VIDIOC_QBUF>`.
 
-       If the device does not support requests, then ``EACCES`` will be returned.
+       If the device does not support requests, then ``EBADR`` will be returned.
        If requests are supported but an invalid request file descriptor is
        given, then ``EINVAL`` will be returned.
 
index 5739c36760622b271a37c5b99cc6a1c1e3d5524e..dbf7b445a27b77193abf98884f5e77e992df6c3d 100644 (file)
@@ -111,7 +111,7 @@ in use. Setting it means that the buffer will not be passed to the driver
 until the request itself is queued. Also, the driver will apply any
 settings associated with the request for this buffer. This field will
 be ignored unless the ``V4L2_BUF_FLAG_REQUEST_FD`` flag is set.
-If the device does not support requests, then ``EACCES`` will be returned.
+If the device does not support requests, then ``EBADR`` will be returned.
 If requests are supported but an invalid request file descriptor is given,
 then ``EINVAL`` will be returned.
 
@@ -125,7 +125,7 @@ then ``EINVAL`` will be returned.
 
    For :ref:`memory-to-memory devices <mem2mem>` you can specify the
    ``request_fd`` only for output buffers, not for capture buffers. Attempting
-   to specify this for a capture buffer will result in an ``EACCES`` error.
+   to specify this for a capture buffer will result in an ``EBADR`` error.
 
 Applications call the ``VIDIOC_DQBUF`` ioctl to dequeue a filled
 (capturing) or displayed (output) buffer from the driver's outgoing
@@ -185,12 +185,10 @@ EPIPE
     codecs if a buffer with the ``V4L2_BUF_FLAG_LAST`` was already
     dequeued and no new buffers are expected to become available.
 
-EACCES
-    The ``V4L2_BUF_FLAG_REQUEST_FD`` flag was set but the device does not
-    support requests for the given buffer type.
-
 EBADR
-    The ``V4L2_BUF_FLAG_REQUEST_FD`` flag was not set but the device requires
+    The ``V4L2_BUF_FLAG_REQUEST_FD`` flag was set but the device does not
+    support requests for the given buffer type, or
+    the ``V4L2_BUF_FLAG_REQUEST_FD`` flag was not set but the device requires
     that the buffer is part of a request.
 
 EBUSY
index 84de18b30a95a3580e9e5f4dc7890060ae8ae335..b11a779e97b028f0ece95461e505e90cf3497f24 100644 (file)
@@ -392,7 +392,7 @@ static int vb2_queue_or_prepare_buf(struct vb2_queue *q, struct media_device *md
                return 0;
        } else if (!q->supports_requests) {
                dprintk(1, "%s: queue does not support requests\n", opname);
-               return -EACCES;
+               return -EBADR;
        } else if (q->uses_qbuf) {
                dprintk(1, "%s: queue does not use requests\n", opname);
                return -EBUSY;
index eec2e2b2f6eca53a3eb29c1129bf0bf481b831ad..ed87305b29f954122bf1dad064bf6b129c422c17 100644 (file)
@@ -251,7 +251,7 @@ media_request_get_by_fd(struct media_device *mdev, int request_fd)
 
        if (!mdev || !mdev->ops ||
            !mdev->ops->req_validate || !mdev->ops->req_queue)
-               return ERR_PTR(-EACCES);
+               return ERR_PTR(-EBADR);
 
        filp = fget(request_fd);
        if (!filp)
@@ -407,7 +407,7 @@ int media_request_object_bind(struct media_request *req,
        int ret = -EBUSY;
 
        if (WARN_ON(!ops->release))
-               return -EACCES;
+               return -EBADR;
 
        spin_lock_irqsave(&req->lock, flags);
 
index bd36d74316984161bd7e1828b60c189affdf8af3..3cd25a2717ce7c7ca42a4b5006529074247edc9e 100644 (file)
@@ -198,7 +198,7 @@ void media_request_put(struct media_request *req);
  * Get the request represented by @request_fd that is owned
  * by the media device.
  *
- * Return a -EACCES error pointer if requests are not supported
+ * Return a -EBADR error pointer if requests are not supported
  * by this driver. Return -EINVAL if the request was not found.
  * Return the pointer to the request if found: the caller will
  * have to call @media_request_put when it finished using the
@@ -231,7 +231,7 @@ static inline void media_request_put(struct media_request *req)
 static inline struct media_request *
 media_request_get_by_fd(struct media_device *mdev, int request_fd)
 {
-       return ERR_PTR(-EACCES);
+       return ERR_PTR(-EBADR);
 }
 
 #endif