|
@@ -846,8 +846,10 @@ static void bond_mc_swap(struct bonding *bond, struct slave *new_active,
|
|
|
if (bond->dev->flags & IFF_ALLMULTI)
|
|
|
dev_set_allmulti(old_active->dev, -1);
|
|
|
|
|
|
+ netif_addr_lock_bh(bond->dev);
|
|
|
netdev_for_each_mc_addr(ha, bond->dev)
|
|
|
dev_mc_del(old_active->dev, ha->addr);
|
|
|
+ netif_addr_unlock_bh(bond->dev);
|
|
|
}
|
|
|
|
|
|
if (new_active) {
|
|
@@ -858,8 +860,10 @@ static void bond_mc_swap(struct bonding *bond, struct slave *new_active,
|
|
|
if (bond->dev->flags & IFF_ALLMULTI)
|
|
|
dev_set_allmulti(new_active->dev, 1);
|
|
|
|
|
|
+ netif_addr_lock_bh(bond->dev);
|
|
|
netdev_for_each_mc_addr(ha, bond->dev)
|
|
|
dev_mc_add(new_active->dev, ha->addr);
|
|
|
+ netif_addr_unlock_bh(bond->dev);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1901,9 +1905,26 @@ err_dest_symlinks:
|
|
|
bond_destroy_slave_symlinks(bond_dev, slave_dev);
|
|
|
|
|
|
err_detach:
|
|
|
+ if (!USES_PRIMARY(bond->params.mode)) {
|
|
|
+ netif_addr_lock_bh(bond_dev);
|
|
|
+ bond_mc_list_flush(bond_dev, slave_dev);
|
|
|
+ netif_addr_unlock_bh(bond_dev);
|
|
|
+ }
|
|
|
+ bond_del_vlans_from_slave(bond, slave_dev);
|
|
|
write_lock_bh(&bond->lock);
|
|
|
bond_detach_slave(bond, new_slave);
|
|
|
+ if (bond->primary_slave == new_slave)
|
|
|
+ bond->primary_slave = NULL;
|
|
|
write_unlock_bh(&bond->lock);
|
|
|
+ if (bond->curr_active_slave == new_slave) {
|
|
|
+ read_lock(&bond->lock);
|
|
|
+ write_lock_bh(&bond->curr_slave_lock);
|
|
|
+ bond_change_active_slave(bond, NULL);
|
|
|
+ bond_select_active_slave(bond);
|
|
|
+ write_unlock_bh(&bond->curr_slave_lock);
|
|
|
+ read_unlock(&bond->lock);
|
|
|
+ }
|
|
|
+ slave_disable_netpoll(new_slave);
|
|
|
|
|
|
err_close:
|
|
|
slave_dev->priv_flags &= ~IFF_BONDING;
|