| From foo@baz Wed Apr 11 10:26:56 CEST 2018 |
| From: Xin Long <lucien.xin@gmail.com> |
| Date: Mon, 26 Mar 2018 01:25:06 +0800 |
| Subject: team: move dev_mc_sync after master_upper_dev_link in team_port_add |
| |
| From: Xin Long <lucien.xin@gmail.com> |
| |
| |
| [ Upstream commit 982cf3b3999d39a2eaca0a65542df33c19b5d814 ] |
| |
| The same fix as in 'bonding: move dev_mc_sync after master_upper_dev_link |
| in bond_enslave' is needed for team driver. |
| |
| The panic can be reproduced easily: |
| |
| ip link add team1 type team |
| ip link set team1 up |
| ip link add link team1 vlan1 type vlan id 80 |
| ip link set vlan1 master team1 |
| |
| Fixes: cb41c997d444 ("team: team should sync the port's uc/mc addrs when add a port") |
| Signed-off-by: Xin Long <lucien.xin@gmail.com> |
| Acked-by: Jiri Pirko <jiri@mellanox.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/team/team.c | 12 +++++------- |
| 1 file changed, 5 insertions(+), 7 deletions(-) |
| |
| --- a/drivers/net/team/team.c |
| +++ b/drivers/net/team/team.c |
| @@ -1203,11 +1203,6 @@ static int team_port_add(struct team *te |
| goto err_dev_open; |
| } |
| |
| - netif_addr_lock_bh(dev); |
| - dev_uc_sync_multiple(port_dev, dev); |
| - dev_mc_sync_multiple(port_dev, dev); |
| - netif_addr_unlock_bh(dev); |
| - |
| err = vlan_vids_add_by_dev(port_dev, dev); |
| if (err) { |
| netdev_err(dev, "Failed to add vlan ids to device %s\n", |
| @@ -1247,6 +1242,11 @@ static int team_port_add(struct team *te |
| goto err_option_port_add; |
| } |
| |
| + netif_addr_lock_bh(dev); |
| + dev_uc_sync_multiple(port_dev, dev); |
| + dev_mc_sync_multiple(port_dev, dev); |
| + netif_addr_unlock_bh(dev); |
| + |
| port->index = -1; |
| list_add_tail_rcu(&port->list, &team->port_list); |
| team_port_enable(team, port); |
| @@ -1271,8 +1271,6 @@ err_enable_netpoll: |
| vlan_vids_del_by_dev(port_dev, dev); |
| |
| err_vids_add: |
| - dev_uc_unsync(port_dev, dev); |
| - dev_mc_unsync(port_dev, dev); |
| dev_close(port_dev); |
| |
| err_dev_open: |