mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
vlan: fix bond/team enslave of vlan challenged slave/port
In vlan_uses_dev() check for number of vlan devs rather than existence of vlan_info. The reason is that vlan id 0 is there without appropriate vlan dev on it by default which prevented from enslaving vlan challenged dev. Reported-by: Jon Stanley <jstanley@rmrf.net> Signed-off-by: Jiri Pirko <jiri@resnulli.us> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
73b7656ce4
commit
55462cf30a
@ -1519,7 +1519,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
|
||||
/* no need to lock since we're protected by rtnl_lock */
|
||||
if (slave_dev->features & NETIF_F_VLAN_CHALLENGED) {
|
||||
pr_debug("%s: NETIF_F_VLAN_CHALLENGED\n", slave_dev->name);
|
||||
if (bond_vlan_used(bond)) {
|
||||
if (vlan_uses_dev(bond_dev)) {
|
||||
pr_err("%s: Error: cannot enslave VLAN challenged slave %s on VLAN enabled bond %s\n",
|
||||
bond_dev->name, slave_dev->name, bond_dev->name);
|
||||
return -EPERM;
|
||||
|
@ -366,6 +366,13 @@ EXPORT_SYMBOL(vlan_vids_del_by_dev);
|
||||
|
||||
bool vlan_uses_dev(const struct net_device *dev)
|
||||
{
|
||||
return rtnl_dereference(dev->vlan_info) ? true : false;
|
||||
struct vlan_info *vlan_info;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
vlan_info = rtnl_dereference(dev->vlan_info);
|
||||
if (!vlan_info)
|
||||
return false;
|
||||
return vlan_info->grp.nr_vlan_devs ? true : false;
|
||||
}
|
||||
EXPORT_SYMBOL(vlan_uses_dev);
|
||||
|
Loading…
Reference in New Issue
Block a user