]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blobdiff - drivers/net/bonding/bond_main.c
bonding: avoid NETDEV_CHANGEMTU event when unregistering slave
[mirror_ubuntu-zesty-kernel.git] / drivers / net / bonding / bond_main.c
index 644d2bf0c4513b4320536e2b07dc3699f368bfbc..335662553f801fac6ef61e190c7c4dd848485379 100644 (file)
@@ -1814,7 +1814,7 @@ err_undo_flags:
  */
 static int __bond_release_one(struct net_device *bond_dev,
                              struct net_device *slave_dev,
-                             bool all)
+                             bool all, bool unregister)
 {
        struct bonding *bond = netdev_priv(bond_dev);
        struct slave *slave, *oldcurrent;
@@ -1958,7 +1958,10 @@ static int __bond_release_one(struct net_device *bond_dev,
                dev_set_mac_address(slave_dev, &addr);
        }
 
-       dev_set_mtu(slave_dev, slave->original_mtu);
+       if (unregister)
+               __dev_set_mtu(slave_dev, slave->original_mtu);
+       else
+               dev_set_mtu(slave_dev, slave->original_mtu);
 
        slave_dev->priv_flags &= ~IFF_BONDING;
 
@@ -1970,7 +1973,7 @@ static int __bond_release_one(struct net_device *bond_dev,
 /* A wrapper used because of ndo_del_link */
 int bond_release(struct net_device *bond_dev, struct net_device *slave_dev)
 {
-       return __bond_release_one(bond_dev, slave_dev, false);
+       return __bond_release_one(bond_dev, slave_dev, false, false);
 }
 
 /* First release a slave and then destroy the bond if no more slaves are left.
@@ -1982,7 +1985,7 @@ static int  bond_release_and_destroy(struct net_device *bond_dev,
        struct bonding *bond = netdev_priv(bond_dev);
        int ret;
 
-       ret = bond_release(bond_dev, slave_dev);
+       ret = __bond_release_one(bond_dev, slave_dev, false, true);
        if (ret == 0 && !bond_has_slaves(bond)) {
                bond_dev->priv_flags |= IFF_DISABLE_NETPOLL;
                netdev_info(bond_dev, "Destroying bond %s\n",
@@ -3033,7 +3036,7 @@ static int bond_slave_netdev_event(unsigned long event,
                if (bond_dev->type != ARPHRD_ETHER)
                        bond_release_and_destroy(bond_dev, slave_dev);
                else
-                       bond_release(bond_dev, slave_dev);
+                       __bond_release_one(bond_dev, slave_dev, false, true);
                break;
        case NETDEV_UP:
        case NETDEV_CHANGE:
@@ -4234,7 +4237,7 @@ static void bond_uninit(struct net_device *bond_dev)
 
        /* Release the bonded slaves */
        bond_for_each_slave(bond, slave, iter)
-               __bond_release_one(bond_dev, slave->dev, true);
+               __bond_release_one(bond_dev, slave->dev, true, true);
        netdev_info(bond_dev, "Released all slaves\n");
 
        arr = rtnl_dereference(bond->slave_arr);