diff options
author | Jiri Pirko <jiri@resnulli.us> | 2012-10-14 04:30:56 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-10-16 14:41:46 -0400 |
commit | 55462cf30ad9768fff6a6d36db21879146a39bdf (patch) | |
tree | f306def961d7f9ca6cc835c5133c592973f91a0c | |
parent | 73b7656ce4e09eb137ee6f845a9e11a7f132df1c (diff) | |
download | linux-3.10-55462cf30ad9768fff6a6d36db21879146a39bdf.tar.gz linux-3.10-55462cf30ad9768fff6a6d36db21879146a39bdf.tar.bz2 linux-3.10-55462cf30ad9768fff6a6d36db21879146a39bdf.zip |
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>
-rw-r--r-- | drivers/net/bonding/bond_main.c | 2 | ||||
-rw-r--r-- | net/8021q/vlan_core.c | 9 |
2 files changed, 9 insertions, 2 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index b721902bb6b..b2530b00212 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -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; diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c index fbbf1fa0094..65e06abe023 100644 --- a/net/8021q/vlan_core.c +++ b/net/8021q/vlan_core.c @@ -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); |