aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXin Long <lucien.xin@gmail.com>2018-03-25 13:16:45 -0400
committerDavid S. Miller <davem@davemloft.net>2018-03-26 12:51:05 -0400
commit5c78f6bfae2b10ff70e21d343e64584ea6280c26 (patch)
treeb972aa491f515ae85494a0b47e678141c6e84e09
parenteb82a994479245a79647d302f9b4eb8e7c9d7ca6 (diff)
bonding: fix the err path for dev hwaddr sync in bond_enslave
vlan_vids_add_by_dev is called right after dev hwaddr sync, so on the err path it should unsync dev hwaddr. Otherwise, the slave dev's hwaddr will never be unsync when this err happens. Fixes: 1ff412ad7714 ("bonding: change the bond's vlan syncing functions with the standard ones") Signed-off-by: Xin Long <lucien.xin@gmail.com> Reviewed-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com> Acked-by: Andy Gospodarek <andy@greyhouse.net> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/bonding/bond_main.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index c669554d70bb..0c299de4f2ef 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -1565,7 +1565,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
1565 if (res) { 1565 if (res) {
1566 netdev_err(bond_dev, "Couldn't add bond vlan ids to %s\n", 1566 netdev_err(bond_dev, "Couldn't add bond vlan ids to %s\n",
1567 slave_dev->name); 1567 slave_dev->name);
1568 goto err_close; 1568 goto err_hwaddr_unsync;
1569 } 1569 }
1570 1570
1571 prev_slave = bond_last_slave(bond); 1571 prev_slave = bond_last_slave(bond);
@@ -1755,9 +1755,6 @@ err_unregister:
1755 netdev_rx_handler_unregister(slave_dev); 1755 netdev_rx_handler_unregister(slave_dev);
1756 1756
1757err_detach: 1757err_detach:
1758 if (!bond_uses_primary(bond))
1759 bond_hw_addr_flush(bond_dev, slave_dev);
1760
1761 vlan_vids_del_by_dev(slave_dev, bond_dev); 1758 vlan_vids_del_by_dev(slave_dev, bond_dev);
1762 if (rcu_access_pointer(bond->primary_slave) == new_slave) 1759 if (rcu_access_pointer(bond->primary_slave) == new_slave)
1763 RCU_INIT_POINTER(bond->primary_slave, NULL); 1760 RCU_INIT_POINTER(bond->primary_slave, NULL);
@@ -1771,6 +1768,10 @@ err_detach:
1771 synchronize_rcu(); 1768 synchronize_rcu();
1772 slave_disable_netpoll(new_slave); 1769 slave_disable_netpoll(new_slave);
1773 1770
1771err_hwaddr_unsync:
1772 if (!bond_uses_primary(bond))
1773 bond_hw_addr_flush(bond_dev, slave_dev);
1774
1774err_close: 1775err_close:
1775 slave_dev->priv_flags &= ~IFF_BONDING; 1776 slave_dev->priv_flags &= ~IFF_BONDING;
1776 dev_close(slave_dev); 1777 dev_close(slave_dev);