change semantics of ldisc ->compat_ioctl()
First of all, make it return int. Returning long when native method had never allowed that is ridiculous and inconvenient. More importantly, change the caller; if ldisc ->compat_ioctl() is NULL or returns -ENOIOCTLCMD, tty_compat_ioctl() will try to feed cmd and compat_ptr(arg) to ldisc's native ->ioctl(). That simplifies ->compat_ioctl() instances quite a bit - they only need to deal with ioctls that are neither generic tty ones (those would get shunted off to tty_ioctl()) nor simple compat pointer ones. Note that something like TCFLSH won't reach ->compat_ioctl(), even if ldisc ->ioctl() does handle it - it will be recognized earlier and passed to tty_ioctl() (and ultimately - ldisc ->ioctl()). For many ldiscs it means that NULL ->compat_ioctl() does the right thing. Those where it won't serve (see e.g. n_r3964.c) are also easily dealt with - we need to handle the numeric-argument ioctls (calling the native instance) and, if such would exist, the ioctls that need layout conversion, etc. All in-tree ldiscs dealt with. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
@@ -34,7 +34,6 @@
|
||||
#include <linux/ip.h>
|
||||
#include <linux/tcp.h>
|
||||
#include <linux/semaphore.h>
|
||||
#include <linux/compat.h>
|
||||
#include <linux/refcount.h>
|
||||
|
||||
#define SIXPACK_VERSION "Revision: 0.3.0"
|
||||
@@ -752,23 +751,6 @@ static int sixpack_ioctl(struct tty_struct *tty, struct file *file,
|
||||
return err;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
static long sixpack_compat_ioctl(struct tty_struct * tty, struct file * file,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
switch (cmd) {
|
||||
case SIOCGIFNAME:
|
||||
case SIOCGIFENCAP:
|
||||
case SIOCSIFENCAP:
|
||||
case SIOCSIFHWADDR:
|
||||
return sixpack_ioctl(tty, file, cmd,
|
||||
(unsigned long)compat_ptr(arg));
|
||||
}
|
||||
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
#endif
|
||||
|
||||
static struct tty_ldisc_ops sp_ldisc = {
|
||||
.owner = THIS_MODULE,
|
||||
.magic = TTY_LDISC_MAGIC,
|
||||
@@ -776,9 +758,6 @@ static struct tty_ldisc_ops sp_ldisc = {
|
||||
.open = sixpack_open,
|
||||
.close = sixpack_close,
|
||||
.ioctl = sixpack_ioctl,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = sixpack_compat_ioctl,
|
||||
#endif
|
||||
.receive_buf = sixpack_receive_buf,
|
||||
.write_wakeup = sixpack_write_wakeup,
|
||||
};
|
||||
|
Reference in New Issue
Block a user