bonding: fix the err path for dev hwaddr sync in bond_enslave
authorXin Long <lucien.xin@gmail.com>
Sun, 25 Mar 2018 17:16:45 +0000 (01:16 +0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 26 Mar 2018 16:51:05 +0000 (12:51 -0400)
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>
drivers/net/bonding/bond_main.c

index c669554d70bb7c7ba2fe3091ed1c58bd3026229f..0c299de4f2ef34d5d134821b7bc3a9d9e8b481c1 100644 (file)
@@ -1565,7 +1565,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
        if (res) {
                netdev_err(bond_dev, "Couldn't add bond vlan ids to %s\n",
                           slave_dev->name);
-               goto err_close;
+               goto err_hwaddr_unsync;
        }
 
        prev_slave = bond_last_slave(bond);
@@ -1755,9 +1755,6 @@ err_unregister:
        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);
@@ -1771,6 +1768,10 @@ 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);