Allow return value passing from ioctl
authorTormod Volden <debian.tormod@gmail.com>
Sun, 29 May 2016 09:34:31 +0000 (11:34 +0200)
committerAlan Cox <alan@etchedpixels.co.uk>
Tue, 31 May 2016 11:43:19 +0000 (12:43 +0100)
Fixes lost values from vt_ioctl().

Signed-off-by: Tormod Volden <debian.tormod@gmail.com>
Kernel/devio.c
Kernel/syscall_fs.c

index 9051cd2..ae82ec4 100644 (file)
@@ -285,18 +285,17 @@ int d_close(uint16_t dev)
 
 int d_ioctl(uint16_t dev, uint16_t request, char *data)
 {
+       int ret;
+
        if (!validdev(dev)) {
                udata.u_error = ENXIO;
                return -1;
        }
 
-       if ((*dev_tab[major(dev)].dev_ioctl) (minor(dev), request, data)) {
-               if (!udata.u_error)     // maybe the ioctl routine might set this?
+       ret =  (*dev_tab[major(dev)].dev_ioctl) (minor(dev), request, data);
+       if (ret == -1 && !udata.u_error)        // maybe the ioctl routine might set this?
                        udata.u_error = ENOTTY;
-               return -1;
-       }
-
-       return 0;
+       return ret;
 }
 
 int d_flush(uint16_t dev)
index 90e877a..43d1334 100644 (file)
@@ -271,9 +271,7 @@ arg_t _ioctl(void)
        dev = ino->c_node.i_addr[0];
 
        /* top bit of request is reserved for kernel originated magic */
-       if (d_ioctl(dev, request & 0x7FFF, data))
-               return -1;
-       return (0);
+       return d_ioctl(dev, request & 0x7FFF, data);
 }
 
 #undef fd