diff mbox

[01/14,media] v4l2 core: return -ENOIOCTLCMD if an ioctl doesn't exist

Message ID 20110626130607.5931a2f8@pedra (mailing list archive)
State RFC
Headers show

Commit Message

Mauro Carvalho Chehab June 26, 2011, 4:06 p.m. UTC
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>

Comments

Linus Torvalds June 27, 2011, 2:49 a.m. UTC | #1
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 mbox

Patch

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/&/\\&amp;/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) &&