eql: use ndo_siocdevprivate
authorArnd Bergmann <arnd@arndb.de>
Tue, 27 Jul 2021 13:44:58 +0000 (15:44 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 27 Jul 2021 19:11:43 +0000 (20:11 +0100)
The private ioctls in eql pass the arguments correctly through ifr_data,
but the slaving_request_t and slave_config_t structures are incompatible
with compat mode and need special conversion code in the driver.

Convert to siocdevprivate for now, and return an error when called
in compat mode.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/eql.c

index 74263f8efe1a622d86af9a9b79f8d965a5870b17..8ef34901c2d8eef46ade52600c31359042463297 100644 (file)
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
+#include <linux/compat.h>
 #include <linux/capability.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 
 static int eql_open(struct net_device *dev);
 static int eql_close(struct net_device *dev);
-static int eql_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
+static int eql_siocdevprivate(struct net_device *dev, struct ifreq *ifr,
+                             void __user *data, int cmd);
 static netdev_tx_t eql_slave_xmit(struct sk_buff *skb, struct net_device *dev);
 
 #define eql_is_slave(dev)      ((dev->flags & IFF_SLAVE) == IFF_SLAVE)
@@ -170,7 +172,7 @@ static const char version[] __initconst =
 static const struct net_device_ops eql_netdev_ops = {
        .ndo_open       = eql_open,
        .ndo_stop       = eql_close,
-       .ndo_do_ioctl   = eql_ioctl,
+       .ndo_siocdevprivate = eql_siocdevprivate,
        .ndo_start_xmit = eql_slave_xmit,
 };
 
@@ -268,25 +270,29 @@ static int eql_s_slave_cfg(struct net_device *dev, slave_config_t __user *sc);
 static int eql_g_master_cfg(struct net_device *dev, master_config_t __user *mc);
 static int eql_s_master_cfg(struct net_device *dev, master_config_t __user *mc);
 
-static int eql_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+static int eql_siocdevprivate(struct net_device *dev, struct ifreq *ifr,
+                             void __user *data, int cmd)
 {
        if (cmd != EQL_GETMASTRCFG && cmd != EQL_GETSLAVECFG &&
            !capable(CAP_NET_ADMIN))
                return -EPERM;
 
+       if (in_compat_syscall()) /* to be implemented */
+               return -EOPNOTSUPP;
+
        switch (cmd) {
                case EQL_ENSLAVE:
-                       return eql_enslave(dev, ifr->ifr_data);
+                       return eql_enslave(dev, data);
                case EQL_EMANCIPATE:
-                       return eql_emancipate(dev, ifr->ifr_data);
+                       return eql_emancipate(dev, data);
                case EQL_GETSLAVECFG:
-                       return eql_g_slave_cfg(dev, ifr->ifr_data);
+                       return eql_g_slave_cfg(dev, data);
                case EQL_SETSLAVECFG:
-                       return eql_s_slave_cfg(dev, ifr->ifr_data);
+                       return eql_s_slave_cfg(dev, data);
                case EQL_GETMASTRCFG:
-                       return eql_g_master_cfg(dev, ifr->ifr_data);
+                       return eql_g_master_cfg(dev, data);
                case EQL_SETMASTRCFG:
-                       return eql_s_master_cfg(dev, ifr->ifr_data);
+                       return eql_s_master_cfg(dev, data);
                default:
                        return -EOPNOTSUPP;
        }