mirror of https://gitee.com/openkylin/linux.git
eql: use ndo_siocdevprivate
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>
This commit is contained in:
parent
32d05468c4
commit
d92f7b59d3
|
@ -113,6 +113,7 @@
|
|||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
#include <linux/compat.h>
|
||||
#include <linux/capability.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
|
@ -131,7 +132,8 @@
|
|||
|
||||
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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue