Commit 3d9d00bd authored by Arnd Bergmann's avatar Arnd Bergmann Committed by David S. Miller
Browse files

net: bonding: move ioctl handling to private ndo operation



All other user triggered operations are gone from ndo_ioctl, so move
the SIOCBOND family into a custom operation as well.

The .ndo_ioctl() helper is no longer called by the dev_ioctl.c code now,
but there are still a few definitions in obsolete wireless drivers as well
as the appletalk and ieee802154 layers to call SIOCSIFADDR/SIOCGIFADDR
helpers from inside the kernel.

Cc: Jay Vosburgh <j.vosburgh@gmail.com>
Cc: Veaceslav Falico <vfalico@gmail.com>
Cc: Andy Gospodarek <andy@greyhouse.net>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ad2f99ae
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -222,6 +222,17 @@ ndo_do_ioctl:
	Synchronization: rtnl_lock() semaphore.
	Context: process

        This is only called by network subsystems internally,
        not by user space calling ioctl as it was in before
        linux-5.14.

ndo_siocbond:
        Synchronization: rtnl_lock() semaphore.
        Context: process

        Used by the bonding driver for the SIOCBOND family of
        ioctl commands.

ndo_siocwandev:
	Synchronization: rtnl_lock() semaphore.
	Context: process
+1 −1
Original line number Diff line number Diff line
@@ -4988,7 +4988,7 @@ static const struct net_device_ops bond_netdev_ops = {
	.ndo_select_queue	= bond_select_queue,
	.ndo_get_stats64	= bond_get_stats,
	.ndo_eth_ioctl		= bond_eth_ioctl,
	.ndo_do_ioctl		= bond_do_ioctl,
	.ndo_siocbond		= bond_do_ioctl,
	.ndo_siocdevprivate	= bond_siocdevprivate,
	.ndo_change_rx_flags	= bond_change_rx_flags,
	.ndo_set_rx_mode	= bond_set_rx_mode,
+10 −3
Original line number Diff line number Diff line
@@ -1086,9 +1086,14 @@ struct netdev_net_notifier {
 *	Test if Media Access Control address is valid for the device.
 *
 * int (*ndo_do_ioctl)(struct net_device *dev, struct ifreq *ifr, int cmd);
 *	Called when a user requests an ioctl which can't be handled by
 *	the generic interface code. If not defined ioctls return
 *	not supported error code.
 *	Old-style ioctl entry point. This is used internally by the
 *	appletalk and ieee802154 subsystems but is no longer called by
 *	the device ioctl handler.
 *
 * int (*ndo_siocbond)(struct net_device *dev, struct ifreq *ifr, int cmd);
 *	Used by the bonding driver for its device specific ioctls:
 *	SIOCBONDENSLAVE, SIOCBONDRELEASE, SIOCBONDSETHWADDR, SIOCBONDCHANGEACTIVE,
 *	SIOCBONDSLAVEINFOQUERY, and SIOCBONDINFOQUERY
 *
 * * int (*ndo_eth_ioctl)(struct net_device *dev, struct ifreq *ifr, int cmd);
 *	Called for ethernet specific ioctls: SIOCGMIIPHY, SIOCGMIIREG,
@@ -1367,6 +1372,8 @@ struct net_device_ops {
					        struct ifreq *ifr, int cmd);
	int			(*ndo_eth_ioctl)(struct net_device *dev,
						 struct ifreq *ifr, int cmd);
	int			(*ndo_siocbond)(struct net_device *dev,
						struct ifreq *ifr, int cmd);
	int			(*ndo_siocwandev)(struct net_device *dev,
						  struct if_settings *ifs);
	int			(*ndo_siocdevprivate)(struct net_device *dev,
+4 −4
Original line number Diff line number Diff line
@@ -260,14 +260,14 @@ static int dev_eth_ioctl(struct net_device *dev,
	return err;
}

static int dev_do_ioctl(struct net_device *dev,
static int dev_siocbond(struct net_device *dev,
			struct ifreq *ifr, unsigned int cmd)
{
	const struct net_device_ops *ops = dev->netdev_ops;

	if (ops->ndo_do_ioctl) {
	if (ops->ndo_siocbond) {
		if (netif_device_present(dev))
			return ops->ndo_do_ioctl(dev, ifr, cmd);
			return ops->ndo_siocbond(dev, ifr, cmd);
		else
			return -ENODEV;
	}
@@ -407,7 +407,7 @@ static int dev_ifsioc(struct net *net, struct ifreq *ifr, void __user *data,
		    cmd == SIOCBONDSLAVEINFOQUERY ||
		    cmd == SIOCBONDINFOQUERY ||
		    cmd == SIOCBONDCHANGEACTIVE) {
			err = dev_do_ioctl(dev, ifr, cmd);
			err = dev_siocbond(dev, ifr, cmd);
		} else
			err = -EINVAL;