| From foo@baz Wed Apr 11 10:26:56 CEST 2018 |
| From: Xin Long <lucien.xin@gmail.com> |
| Date: Mon, 26 Mar 2018 01:16:45 +0800 |
| Subject: bonding: fix the err path for dev hwaddr sync in bond_enslave |
| |
| From: Xin Long <lucien.xin@gmail.com> |
| |
| |
| [ Upstream commit 5c78f6bfae2b10ff70e21d343e64584ea6280c26 ] |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/bonding/bond_main.c | 9 +++++---- |
| 1 file changed, 5 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/net/bonding/bond_main.c |
| +++ b/drivers/net/bonding/bond_main.c |
| @@ -1561,7 +1561,7 @@ int bond_enslave(struct net_device *bond |
| 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); |
| @@ -1749,9 +1749,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); |
| @@ -1765,6 +1762,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); |