|
@@ -1528,44 +1528,11 @@ 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",
|
|
|
slave_dev->name);
|
|
|
- goto err_hwaddr_unsync;
|
|
|
+ goto err_close;
|
|
|
}
|
|
|
|
|
|
prev_slave = bond_last_slave(bond);
|
|
@@ -1725,6 +1692,37 @@ 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)
|
|
|
+ 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 +1746,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);
|
|
|
|
|
@@ -1768,10 +1769,6 @@ err_detach:
|
|
|
synchronize_rcu();
|
|
|
slave_disable_netpoll(new_slave);
|
|
|
|
|
|
-err_hwaddr_unsync:
|
|
|
- if (!bond_uses_primary(bond))
|
|
|
- bond_hw_addr_flush(bond_dev, slave_dev);
|
|
|
-
|
|
|
err_close:
|
|
|
slave_dev->priv_flags &= ~IFF_BONDING;
|
|
|
dev_close(slave_dev);
|