Message ID | 20190419063100.5224-1-liuhangbin@gmail.com |
---|---|
State | Accepted |
Delegated to: | David Miller |
Headers | show |
Series | [PATCHv2,net] team: fix possible recursive locking when add slaves | expand |
From: Hangbin Liu <liuhangbin@gmail.com> Date: Fri, 19 Apr 2019 14:31:00 +0800 > If we add a bond device which is already the master of the team interface, > we will hold the team->lock in team_add_slave() first and then request the > lock in team_set_mac_address() again. The functions are called like: > > - team_add_slave() > - team_port_add() > - team_port_enter() > - team_modeop_port_enter() > - __set_port_dev_addr() > - dev_set_mac_address() > - bond_set_mac_address() > - dev_set_mac_address() > - team_set_mac_address > > Although team_upper_dev_link() would check the upper devices but it is > called too late. Fix it by adding a checking before processing the slave. > > v2: Do not split the string in netdev_err() > > Fixes: 3d249d4ca7d0 ("net: introduce ethernet teaming device") > Acked-by: Jiri Pirko <jiri@mellanox.com> > Signed-off-by: Hangbin Liu <liuhangbin@gmail.com> Applied and queued up for -stable, thanks.
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index 9ce61b019aad..16963f7a88f7 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c @@ -1156,6 +1156,13 @@ static int team_port_add(struct team *team, struct net_device *port_dev, return -EINVAL; } + if (netdev_has_upper_dev(dev, port_dev)) { + NL_SET_ERR_MSG(extack, "Device is already an upper device of the team interface"); + netdev_err(dev, "Device %s is already an upper device of the team interface\n", + portname); + return -EBUSY; + } + if (port_dev->features & NETIF_F_VLAN_CHALLENGED && vlan_uses_dev(dev)) { NL_SET_ERR_MSG(extack, "Device is VLAN challenged and team device has VLAN set up");