Message ID | 20110626130607.5931a2f8@pedra (mailing list archive) |
---|---|
State | RFC |
Headers | show |
On Sun, Jun 26, 2011 at 9:06 AM, Mauro Carvalho Chehab <mchehab@redhat.com> wrote: > + <term><errorcode>ENOIOCTLCMD</errorcode></term> > + <listitem> > + <para>The application attempted to use a non-existent ioctl. This is returned by the V4L2 core only. > + Applications should be able to handle this error code, in order to detect if a new ioctl is > + not implemented at the current Kernel version. Kernel versions lower than 3.0 returns EINVAL to > + non-existing ioctl's.</para> This seems entirely bogus. ENOICTLCMD is meant to be an entirely kernel-internal one, which is meant to never be shown to user space. IOW, vfs_ioctl() turns it into EINVAL (which I personally think is bogus - traditionally ENOTTY is the right one for "not a valid ioctl", but there are people who disagree - whatever) The rationale for it is mainly as a way for layers inside the kernel to determine the difference between "ioctl existed but failed with EINVAL" vs "ioctl doesn't actually exist". Some layers try first one thing and then another, and want to know the difference. An example of that might be some code that first tries to call device-specific version, and if that doesn't exist, do a generic emulation version. Of course, as far as I can tell, almost nothing does that anyway. Regardless, it's definitely wrong to document it as being returned to user land. It should never be user-visible. Linus -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/Documentation/DocBook/media/Makefile b/Documentation/DocBook/media/Makefile index 8cb27f3..93722da 100644 --- a/Documentation/DocBook/media/Makefile +++ b/Documentation/DocBook/media/Makefile @@ -117,6 +117,7 @@ ERRORS = \ EPERM \ ERANGE \ EPIPE \ + ENOIOCTLCMD \ ESCAPE = \ -e "s/&/\\&/g" \ diff --git a/Documentation/DocBook/media/v4l/func-ioctl.xml b/Documentation/DocBook/media/v4l/func-ioctl.xml index b60fd37..0c97ba9 100644 --- a/Documentation/DocBook/media/v4l/func-ioctl.xml +++ b/Documentation/DocBook/media/v4l/func-ioctl.xml @@ -132,14 +132,15 @@ complete the request.</para> &VIDIOC-S-CTRL; ioctl to a value which is out of bounds.</para> </listitem> </varlistentry> + <varlistentry> + <term><errorcode>ENOIOCTLCMD</errorcode></term> + <listitem> + <para>The application attempted to use a non-existent ioctl. This is returned by the V4L2 core only. + Applications should be able to handle this error code, in order to detect if a new ioctl is + not implemented at the current Kernel version. Kernel versions lower than 3.0 returns EINVAL to + non-existing ioctl's.</para> + </listitem> + </varlistentry> </variablelist> </refsect1> </refentry> - -<!-- -Local Variables: -mode: sgml -sgml-parent-document: "v4l2.sgml" -indent-tabs-mode: nil -End: ---> diff --git a/Documentation/DocBook/media/v4l/v4l2.xml b/Documentation/DocBook/media/v4l/v4l2.xml index a7fd76d..7bac5f9 100644 --- a/Documentation/DocBook/media/v4l/v4l2.xml +++ b/Documentation/DocBook/media/v4l/v4l2.xml @@ -128,6 +128,13 @@ structs, ioctls) must be noted in more detail in the history chapter applications. --> <revision> + <revnumber>3.0.0</revnumber> + <date>2011-06-24</date> + <authorinitials>mcc</authorinitials> + <revremark>Standardize an error code for invalid ioctl.</revremark> + </revision> + + <revision> <revnumber>2.6.39</revnumber> <date>2011-03-01</date> <authorinitials>mcc, po</authorinitials> diff --git a/drivers/media/video/v4l2-ioctl.c b/drivers/media/video/v4l2-ioctl.c index 213ba7d..ebdf762 100644 --- a/drivers/media/video/v4l2-ioctl.c +++ b/drivers/media/video/v4l2-ioctl.c @@ -542,12 +542,12 @@ static long __video_do_ioctl(struct file *file, struct v4l2_fh *vfh = NULL; struct v4l2_format f_copy; int use_fh_prio = 0; - long ret = -EINVAL; + long ret = -ENOIOCTLCMD; if (ops == NULL) { printk(KERN_WARNING "videodev: \"%s\" has no ioctl_ops.\n", vfd->name); - return -EINVAL; + return ret; } if ((vfd->debug & V4L2_DEBUG_IOCTL) &&
Currently, -EINVAL is used to return either when an IOCTL is not implemented, or if the ioctl was not implemented. Note: Drivers that don't use video_ioctl2, will need extra patches. Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>