Merge branch 'bond-hwaddr-sync-fixes'
Xin Long says: ==================== bonding: a bunch of fixes for dev hwaddr sync in bond_enslave This patchset is mainly to fix a crash when adding vlan as slave of bond which is also the parent link in patch 2/3, and also fix some err process problems in bond_enslave in patch 1/3 and 3/3. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
e49c78f4aa
|
@ -1528,39 +1528,6 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
|
|||
goto err_close;
|
||||
}
|
||||
|
||||
/* If the mode uses primary, then the following is handled by
|
||||
* bond_change_active_slave().
|
||||
*/
|
||||
if (!bond_uses_primary(bond)) {
|
||||
/* set promiscuity level to new slave */
|
||||
if (bond_dev->flags & IFF_PROMISC) {
|
||||
res = dev_set_promiscuity(slave_dev, 1);
|
||||
if (res)
|
||||
goto err_close;
|
||||
}
|
||||
|
||||
/* set allmulti level to new slave */
|
||||
if (bond_dev->flags & IFF_ALLMULTI) {
|
||||
res = dev_set_allmulti(slave_dev, 1);
|
||||
if (res)
|
||||
goto err_close;
|
||||
}
|
||||
|
||||
netif_addr_lock_bh(bond_dev);
|
||||
|
||||
dev_mc_sync_multiple(slave_dev, bond_dev);
|
||||
dev_uc_sync_multiple(slave_dev, bond_dev);
|
||||
|
||||
netif_addr_unlock_bh(bond_dev);
|
||||
}
|
||||
|
||||
if (BOND_MODE(bond) == BOND_MODE_8023AD) {
|
||||
/* add lacpdu mc addr to mc list */
|
||||
u8 lacpdu_multicast[ETH_ALEN] = MULTICAST_LACPDU_ADDR;
|
||||
|
||||
dev_mc_add(slave_dev, lacpdu_multicast);
|
||||
}
|
||||
|
||||
res = vlan_vids_add_by_dev(slave_dev, bond_dev);
|
||||
if (res) {
|
||||
netdev_err(bond_dev, "Couldn't add bond vlan ids to %s\n",
|
||||
|
@ -1725,6 +1692,40 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
|
|||
goto err_upper_unlink;
|
||||
}
|
||||
|
||||
/* If the mode uses primary, then the following is handled by
|
||||
* bond_change_active_slave().
|
||||
*/
|
||||
if (!bond_uses_primary(bond)) {
|
||||
/* set promiscuity level to new slave */
|
||||
if (bond_dev->flags & IFF_PROMISC) {
|
||||
res = dev_set_promiscuity(slave_dev, 1);
|
||||
if (res)
|
||||
goto err_sysfs_del;
|
||||
}
|
||||
|
||||
/* set allmulti level to new slave */
|
||||
if (bond_dev->flags & IFF_ALLMULTI) {
|
||||
res = dev_set_allmulti(slave_dev, 1);
|
||||
if (res) {
|
||||
if (bond_dev->flags & IFF_PROMISC)
|
||||
dev_set_promiscuity(slave_dev, -1);
|
||||
goto err_sysfs_del;
|
||||
}
|
||||
}
|
||||
|
||||
netif_addr_lock_bh(bond_dev);
|
||||
dev_mc_sync_multiple(slave_dev, bond_dev);
|
||||
dev_uc_sync_multiple(slave_dev, bond_dev);
|
||||
netif_addr_unlock_bh(bond_dev);
|
||||
|
||||
if (BOND_MODE(bond) == BOND_MODE_8023AD) {
|
||||
/* add lacpdu mc addr to mc list */
|
||||
u8 lacpdu_multicast[ETH_ALEN] = MULTICAST_LACPDU_ADDR;
|
||||
|
||||
dev_mc_add(slave_dev, lacpdu_multicast);
|
||||
}
|
||||
}
|
||||
|
||||
bond->slave_cnt++;
|
||||
bond_compute_features(bond);
|
||||
bond_set_carrier(bond);
|
||||
|
@ -1748,6 +1749,9 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
|
|||
return 0;
|
||||
|
||||
/* Undo stages on error */
|
||||
err_sysfs_del:
|
||||
bond_sysfs_slave_del(new_slave);
|
||||
|
||||
err_upper_unlink:
|
||||
bond_upper_dev_unlink(bond, new_slave);
|
||||
|
||||
|
@ -1755,9 +1759,6 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
|
|||
netdev_rx_handler_unregister(slave_dev);
|
||||
|
||||
err_detach:
|
||||
if (!bond_uses_primary(bond))
|
||||
bond_hw_addr_flush(bond_dev, slave_dev);
|
||||
|
||||
vlan_vids_del_by_dev(slave_dev, bond_dev);
|
||||
if (rcu_access_pointer(bond->primary_slave) == new_slave)
|
||||
RCU_INIT_POINTER(bond->primary_slave, NULL);
|
||||
|
|
Loading…
Reference in New Issue