net: bonding: move ioctl handling to private ndo operation
authorArnd Bergmann <arnd@arndb.de>
Tue, 27 Jul 2021 13:45:17 +0000 (15:45 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 27 Jul 2021 19:11:45 +0000 (20:11 +0100)
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: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
Documentation/networking/netdevices.rst
drivers/net/bonding/bond_main.c
include/linux/netdevice.h
net/core/dev_ioctl.c

index 3c42b0b0be939c01e3bfb7c6d3f45784c34ec05c..9e4cccb90b8700aea49bb586ca0da79f2fe185b9 100644 (file)
@@ -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
index 23769e937c286397f4a9b7e8c939ee9e44fb2601..bec8ceaff98f1f2ca908cf5f1f2abf277ae56189 100644 (file)
@@ -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,
index cc11382f76a3039a3253f5a73b57c15d0a3e85e2..226bbee06730da15cebf68e75387573947813b62 100644 (file)
@@ -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,
index 3166f196b2968946f1a39d076d2e7d684d10f398..4035bce06bf8ff3bc4abc3e67b65ddc5038d8713 100644 (file)
@@ -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;