diff options
author | Xin Long <lucien.xin@gmail.com> | 2018-03-25 13:25:06 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-03-26 12:51:45 -0400 |
commit | 982cf3b3999d39a2eaca0a65542df33c19b5d814 (patch) | |
tree | 36d984cbe955ff04323c64fa4032c16809f2daa7 | |
parent | e49c78f4aa1d3985226a61edcd48dc002227581f (diff) |
team: move dev_mc_sync after master_upper_dev_link in team_port_add
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>
-rw-r--r-- | drivers/net/team/team.c | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index 56c701b73c12..befed2d22bf4 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c | |||
@@ -1197,11 +1197,6 @@ static int team_port_add(struct team *team, struct net_device *port_dev) | |||
1197 | goto err_dev_open; | 1197 | goto err_dev_open; |
1198 | } | 1198 | } |
1199 | 1199 | ||
1200 | netif_addr_lock_bh(dev); | ||
1201 | dev_uc_sync_multiple(port_dev, dev); | ||
1202 | dev_mc_sync_multiple(port_dev, dev); | ||
1203 | netif_addr_unlock_bh(dev); | ||
1204 | |||
1205 | err = vlan_vids_add_by_dev(port_dev, dev); | 1200 | err = vlan_vids_add_by_dev(port_dev, dev); |
1206 | if (err) { | 1201 | if (err) { |
1207 | netdev_err(dev, "Failed to add vlan ids to device %s\n", | 1202 | netdev_err(dev, "Failed to add vlan ids to device %s\n", |
@@ -1241,6 +1236,11 @@ static int team_port_add(struct team *team, struct net_device *port_dev) | |||
1241 | goto err_option_port_add; | 1236 | goto err_option_port_add; |
1242 | } | 1237 | } |
1243 | 1238 | ||
1239 | netif_addr_lock_bh(dev); | ||
1240 | dev_uc_sync_multiple(port_dev, dev); | ||
1241 | dev_mc_sync_multiple(port_dev, dev); | ||
1242 | netif_addr_unlock_bh(dev); | ||
1243 | |||
1244 | port->index = -1; | 1244 | port->index = -1; |
1245 | list_add_tail_rcu(&port->list, &team->port_list); | 1245 | list_add_tail_rcu(&port->list, &team->port_list); |
1246 | team_port_enable(team, port); | 1246 | team_port_enable(team, port); |
@@ -1265,8 +1265,6 @@ err_enable_netpoll: | |||
1265 | vlan_vids_del_by_dev(port_dev, dev); | 1265 | vlan_vids_del_by_dev(port_dev, dev); |
1266 | 1266 | ||
1267 | err_vids_add: | 1267 | err_vids_add: |
1268 | dev_uc_unsync(port_dev, dev); | ||
1269 | dev_mc_unsync(port_dev, dev); | ||
1270 | dev_close(port_dev); | 1268 | dev_close(port_dev); |
1271 | 1269 | ||
1272 | err_dev_open: | 1270 | err_dev_open: |