Commit 15cd442e authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

media: media-request: EPERM -> EACCES/EBUSY

If requests are not supported by the driver, then return EACCES, not
EPERM.

If you attempt to mix queueing buffers directly and using requests,
then EBUSY is returned instead of EPERM: once a specific queueing mode
has been chosen the queue is 'busy' if you attempt the other mode
(i.e. direct queueing vs via a request).
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Reviewed-by: default avatarTomasz Figa <tfiga@chromium.org>
Acked-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent ffda0b4c
...@@ -49,7 +49,7 @@ exception is the ``EIO`` error which signals a fatal error that requires ...@@ -49,7 +49,7 @@ exception is the ``EIO`` error which signals a fatal error that requires
the application to stop streaming to reset the hardware state. the application to stop streaming to reset the hardware state.
It is not allowed to mix queuing requests with queuing buffers directly It is not allowed to mix queuing requests with queuing buffers directly
(without a request). ``EPERM`` will be returned if the first buffer was (without a request). ``EBUSY`` will be returned if the first buffer was
queued directly and you next try to queue a request, or vice versa. queued directly and you next try to queue a request, or vice versa.
A request must contain at least one buffer, otherwise this ioctl will A request must contain at least one buffer, otherwise this ioctl will
...@@ -63,10 +63,9 @@ appropriately. The generic error codes are described at the ...@@ -63,10 +63,9 @@ appropriately. The generic error codes are described at the
:ref:`Generic Error Codes <gen-errors>` chapter. :ref:`Generic Error Codes <gen-errors>` chapter.
EBUSY EBUSY
The request was already queued. The request was already queued or the application queued the first
EPERM buffer directly, but later attempted to use a request. It is not permitted
The application queued the first buffer directly, but later attempted to mix the two APIs.
to use a request. It is not permitted to mix the two APIs.
ENOENT ENOENT
The request did not contain any buffers. All requests are required The request did not contain any buffers. All requests are required
to have at least one buffer. This can also be returned if required to have at least one buffer. This can also be returned if required
......
...@@ -64,7 +64,7 @@ request cannot be modified anymore. ...@@ -64,7 +64,7 @@ request cannot be modified anymore.
.. caution:: .. caution::
For :ref:`memory-to-memory devices <codec>` you can use requests only for For :ref:`memory-to-memory devices <codec>` you can use requests only for
output buffers, not for capture buffers. Attempting to add a capture buffer output buffers, not for capture buffers. Attempting to add a capture buffer
to a request will result in an ``EPERM`` error. to a request will result in an ``EACCES`` error.
If the request contains parameters for multiple entities, individual drivers may If the request contains parameters for multiple entities, individual drivers may
synchronize so the requested pipeline's topology is applied before the buffers synchronize so the requested pipeline's topology is applied before the buffers
...@@ -77,7 +77,7 @@ perfect atomicity may not be possible due to hardware limitations. ...@@ -77,7 +77,7 @@ perfect atomicity may not be possible due to hardware limitations.
whichever method is used first locks this in place until whichever method is used first locks this in place until
:ref:`VIDIOC_STREAMOFF <VIDIOC_STREAMON>` is called or the device is :ref:`VIDIOC_STREAMOFF <VIDIOC_STREAMON>` is called or the device is
:ref:`closed <func-close>`. Attempts to directly queue a buffer when earlier :ref:`closed <func-close>`. Attempts to directly queue a buffer when earlier
a buffer was queued via a request or vice versa will result in an ``EPERM`` a buffer was queued via a request or vice versa will result in an ``EBUSY``
error. error.
Controls can still be set without a request and are applied immediately, Controls can still be set without a request and are applied immediately,
......
...@@ -314,7 +314,7 @@ struct v4l2_buffer ...@@ -314,7 +314,7 @@ struct v4l2_buffer
:ref:`ioctl VIDIOC_QBUF <VIDIOC_QBUF>` and ignored by other ioctls. :ref:`ioctl VIDIOC_QBUF <VIDIOC_QBUF>` and ignored by other ioctls.
Applications should not set ``V4L2_BUF_FLAG_REQUEST_FD`` for any ioctls Applications should not set ``V4L2_BUF_FLAG_REQUEST_FD`` for any ioctls
other than :ref:`VIDIOC_QBUF <VIDIOC_QBUF>`. other than :ref:`VIDIOC_QBUF <VIDIOC_QBUF>`.
If the device does not support requests, then ``EPERM`` will be returned. If the device does not support requests, then ``EACCES`` will be returned.
If requests are supported but an invalid request file descriptor is If requests are supported but an invalid request file descriptor is
given, then ``EINVAL`` will be returned. given, then ``EINVAL`` will be returned.
......
...@@ -100,7 +100,7 @@ file descriptor and ``which`` is set to ``V4L2_CTRL_WHICH_REQUEST_VAL``, ...@@ -100,7 +100,7 @@ file descriptor and ``which`` is set to ``V4L2_CTRL_WHICH_REQUEST_VAL``,
then the controls are not applied immediately when calling then the controls are not applied immediately when calling
:ref:`VIDIOC_S_EXT_CTRLS <VIDIOC_G_EXT_CTRLS>`, but instead are applied by :ref:`VIDIOC_S_EXT_CTRLS <VIDIOC_G_EXT_CTRLS>`, but instead are applied by
the driver for the buffer associated with the same request. the driver for the buffer associated with the same request.
If the device does not support requests, then ``EPERM`` will be returned. If the device does not support requests, then ``EACCES`` will be returned.
If requests are supported but an invalid request file descriptor is given, If requests are supported but an invalid request file descriptor is given,
then ``EINVAL`` will be returned. then ``EINVAL`` will be returned.
...@@ -233,7 +233,7 @@ still cause this situation. ...@@ -233,7 +233,7 @@ still cause this situation.
these controls have to be retrieved from a request or tried/set for these controls have to be retrieved from a request or tried/set for
a request. In the latter case the ``request_fd`` field contains the a request. In the latter case the ``request_fd`` field contains the
file descriptor of the request that should be used. If the device file descriptor of the request that should be used. If the device
does not support requests, then ``EPERM`` will be returned. does not support requests, then ``EACCES`` will be returned.
.. note:: .. note::
...@@ -299,7 +299,7 @@ still cause this situation. ...@@ -299,7 +299,7 @@ still cause this situation.
- ``request_fd`` - ``request_fd``
- File descriptor of the request to be used by this operation. Only - File descriptor of the request to be used by this operation. Only
valid if ``which`` is set to ``V4L2_CTRL_WHICH_REQUEST_VAL``. valid if ``which`` is set to ``V4L2_CTRL_WHICH_REQUEST_VAL``.
If the device does not support requests, then ``EPERM`` will be returned. If the device does not support requests, then ``EACCES`` will be returned.
If requests are supported but an invalid request file descriptor is If requests are supported but an invalid request file descriptor is
given, then ``EINVAL`` will be returned. given, then ``EINVAL`` will be returned.
* - __u32 * - __u32
...@@ -408,6 +408,5 @@ EACCES ...@@ -408,6 +408,5 @@ EACCES
control, or to get a control from a request that has not yet been control, or to get a control from a request that has not yet been
completed. completed.
EPERM Or the ``which`` field was set to ``V4L2_CTRL_WHICH_REQUEST_VAL`` but the
The ``which`` field was set to ``V4L2_CTRL_WHICH_REQUEST_VAL`` but the
device does not support requests. device does not support requests.
...@@ -104,18 +104,18 @@ in use. Setting it means that the buffer will not be passed to the driver ...@@ -104,18 +104,18 @@ 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 until the request itself is queued. Also, the driver will apply any
settings associated with the request for this buffer. This field will settings associated with the request for this buffer. This field will
be ignored unless the ``V4L2_BUF_FLAG_REQUEST_FD`` flag is set. be ignored unless the ``V4L2_BUF_FLAG_REQUEST_FD`` flag is set.
If the device does not support requests, then ``EPERM`` will be returned. If the device does not support requests, then ``EACCES`` will be returned.
If requests are supported but an invalid request file descriptor is given, If requests are supported but an invalid request file descriptor is given,
then ``EINVAL`` will be returned. then ``EINVAL`` will be returned.
.. caution:: .. caution::
It is not allowed to mix queuing requests with queuing buffers directly. It is not allowed to mix queuing requests with queuing buffers directly.
``EPERM`` will be returned if the first buffer was queued directly and ``EBUSY`` will be returned if the first buffer was queued directly and
then the application tries to queue a request, or vice versa. then the application tries to queue a request, or vice versa.
For :ref:`memory-to-memory devices <codec>` you can specify the For :ref:`memory-to-memory devices <codec>` you can specify the
``request_fd`` only for output buffers, not for capture buffers. Attempting ``request_fd`` only for output buffers, not for capture buffers. Attempting
to specify this for a capture buffer will result in an ``EPERM`` error. to specify this for a capture buffer will result in an ``EACCES`` error.
Applications call the ``VIDIOC_DQBUF`` ioctl to dequeue a filled Applications call the ``VIDIOC_DQBUF`` ioctl to dequeue a filled
(capturing) or displayed (output) buffer from the driver's outgoing (capturing) or displayed (output) buffer from the driver's outgoing
...@@ -175,9 +175,11 @@ EPIPE ...@@ -175,9 +175,11 @@ EPIPE
codecs if a buffer with the ``V4L2_BUF_FLAG_LAST`` was already codecs if a buffer with the ``V4L2_BUF_FLAG_LAST`` was already
dequeued and no new buffers are expected to become available. dequeued and no new buffers are expected to become available.
EPERM EACCES
The ``V4L2_BUF_FLAG_REQUEST_FD`` flag was set but the device does not The ``V4L2_BUF_FLAG_REQUEST_FD`` flag was set but the device does not
support requests. Or the first buffer was queued via a request, but support requests for the given buffer type.
the application now tries to queue it directly, or vice versa (it is
not permitted to mix the two APIs). Or an attempt is made to queue a EBUSY
CAPTURE buffer to a request for a :ref:`memory-to-memory device <codec>`. The first buffer was queued via a request, but the application now tries
to queue it directly, or vice versa (it is not permitted to mix the two
APIs).
...@@ -1495,7 +1495,7 @@ int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb, ...@@ -1495,7 +1495,7 @@ int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb,
(!req && vb->state != VB2_BUF_STATE_IN_REQUEST && (!req && vb->state != VB2_BUF_STATE_IN_REQUEST &&
q->uses_requests)) { q->uses_requests)) {
dprintk(1, "queue in wrong mode (qbuf vs requests)\n"); dprintk(1, "queue in wrong mode (qbuf vs requests)\n");
return -EPERM; return -EBUSY;
} }
if (req) { if (req) {
......
...@@ -381,12 +381,15 @@ static int vb2_queue_or_prepare_buf(struct vb2_queue *q, struct media_device *md ...@@ -381,12 +381,15 @@ static int vb2_queue_or_prepare_buf(struct vb2_queue *q, struct media_device *md
if (!(b->flags & V4L2_BUF_FLAG_REQUEST_FD)) { if (!(b->flags & V4L2_BUF_FLAG_REQUEST_FD)) {
if (q->uses_requests) { if (q->uses_requests) {
dprintk(1, "%s: queue uses requests\n", opname); dprintk(1, "%s: queue uses requests\n", opname);
return -EPERM; return -EBUSY;
} }
return 0; return 0;
} else if (q->uses_qbuf || !q->supports_requests) { } else if (!q->supports_requests) {
dprintk(1, "%s: queue does not support requests\n", opname);
return -EACCES;
} else if (q->uses_qbuf) {
dprintk(1, "%s: queue does not use requests\n", opname); dprintk(1, "%s: queue does not use requests\n", opname);
return -EPERM; return -EBUSY;
} }
/* /*
......
...@@ -249,7 +249,7 @@ media_request_get_by_fd(struct media_device *mdev, int request_fd) ...@@ -249,7 +249,7 @@ media_request_get_by_fd(struct media_device *mdev, int request_fd)
if (!mdev || !mdev->ops || if (!mdev || !mdev->ops ||
!mdev->ops->req_validate || !mdev->ops->req_queue) !mdev->ops->req_validate || !mdev->ops->req_queue)
return ERR_PTR(-EPERM); return ERR_PTR(-EACCES);
filp = fget(request_fd); filp = fget(request_fd);
if (!filp) if (!filp)
...@@ -405,7 +405,7 @@ int media_request_object_bind(struct media_request *req, ...@@ -405,7 +405,7 @@ int media_request_object_bind(struct media_request *req,
int ret = -EBUSY; int ret = -EBUSY;
if (WARN_ON(!ops->release)) if (WARN_ON(!ops->release))
return -EPERM; return -EACCES;
spin_lock_irqsave(&req->lock, flags); spin_lock_irqsave(&req->lock, flags);
......
...@@ -198,7 +198,7 @@ void media_request_put(struct media_request *req); ...@@ -198,7 +198,7 @@ void media_request_put(struct media_request *req);
* Get the request represented by @request_fd that is owned * Get the request represented by @request_fd that is owned
* by the media device. * by the media device.
* *
* Return a -EPERM error pointer if requests are not supported * Return a -EACCES error pointer if requests are not supported
* by this driver. Return -EINVAL if the request was not found. * by this driver. Return -EINVAL if the request was not found.
* Return the pointer to the request if found: the caller will * Return the pointer to the request if found: the caller will
* have to call @media_request_put when it finished using the * 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) ...@@ -231,7 +231,7 @@ static inline void media_request_put(struct media_request *req)
static inline struct media_request * static inline struct media_request *
media_request_get_by_fd(struct media_device *mdev, int request_fd) media_request_get_by_fd(struct media_device *mdev, int request_fd)
{ {
return ERR_PTR(-EPERM); return ERR_PTR(-EACCES);
} }
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment