diff options
author | Ido Schimmel <idosch@mellanox.com> | 2018-12-19 06:08:41 +0000 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2019-07-10 09:53:44 +0200 |
commit | cd54dc4cd37d0b18280c29f2bf25ba08d6895b3c (patch) | |
tree | 5f34d4dbb5cc6dd1368778b625f58fe1d2a1b2cb | |
parent | a8a296abee3667329a68fa15851c4684c9c92874 (diff) | |
download | linux-stable-cd54dc4cd37d0b18280c29f2bf25ba08d6895b3c.tar.gz linux-stable-cd54dc4cd37d0b18280c29f2bf25ba08d6895b3c.tar.bz2 linux-stable-cd54dc4cd37d0b18280c29f2bf25ba08d6895b3c.zip |
mlxsw: spectrum: Handle VLAN device unlinking
[ Upstream commit e149113a74c35f0a28d1bfe17d2505a03563c1d5 ]
In commit 993107fea5ee ("mlxsw: spectrum_switchdev: Fix VLAN device
deletion via ioctl") I fixed a bug caused by the fact that the driver
views differently the deletion of a VLAN device when it is deleted via
an ioctl and netlink.
Instead of relying on a specific order of events (device being
unregistered vs. VLAN filter being updated), simply make sure that the
driver performs the necessary cleanup when the VLAN device is unlinked,
which always happens before the other two events.
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Reviewed-by: Petr Machata <petrm@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c index ff2f6b8e2fab..0cab06046e5d 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c @@ -4681,6 +4681,16 @@ static int mlxsw_sp_netdevice_port_upper_event(struct net_device *lower_dev, } else if (netif_is_macvlan(upper_dev)) { if (!info->linking) mlxsw_sp_rif_macvlan_del(mlxsw_sp, upper_dev); + } else if (is_vlan_dev(upper_dev)) { + struct net_device *br_dev; + + if (!netif_is_bridge_port(upper_dev)) + break; + if (info->linking) + break; + br_dev = netdev_master_upper_dev_get(upper_dev); + mlxsw_sp_port_bridge_leave(mlxsw_sp_port, upper_dev, + br_dev); } break; } |