resolves bz 1005567
This commit is contained in:
parent
7f68f83dae
commit
7def6fca21
|
@ -0,0 +1,73 @@
|
|||
commit 5a0068deb611109c5ba77358be533f763f395ee4
|
||||
Author: Neil Horman <nhorman@tuxdriver.com>
|
||||
Date: Fri Sep 27 12:22:15 2013 -0400
|
||||
|
||||
bonding: Fix broken promiscuity reference counting issue
|
||||
|
||||
Recently grabbed this report:
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1005567
|
||||
|
||||
Of an issue in which the bonding driver, with an attached vlan encountered the
|
||||
following errors when bond0 was taken down and back up:
|
||||
|
||||
dummy1: promiscuity touches roof, set promiscuity failed. promiscuity feature of
|
||||
device might be broken.
|
||||
|
||||
The error occurs because, during __bond_release_one, if we release our last
|
||||
slave, we take on a random mac address and issue a NETDEV_CHANGEADDR
|
||||
notification. With an attached vlan, the vlan may see that the vlan and bond
|
||||
mac address were in sync, but no longer are. This triggers a call to dev_uc_add
|
||||
and dev_set_rx_mode, which enables IFF_PROMISC on the bond device. Then, when
|
||||
we complete __bond_release_one, we use the current state of the bond flags to
|
||||
determine if we should decrement the promiscuity of the releasing slave. But
|
||||
since the bond changed promiscuity state during the release operation, we
|
||||
incorrectly decrement the slave promisc count when it wasn't in promiscuous mode
|
||||
to begin with, causing the above error
|
||||
|
||||
Fix is pretty simple, just cache the bonding flags at the start of the function
|
||||
and use those when determining the need to set promiscuity.
|
||||
|
||||
This is also needed for the ALLMULTI flag
|
||||
|
||||
CC: Jay Vosburgh <fubar@us.ibm.com>
|
||||
CC: Andy Gospodarek <andy@greyhouse.net>
|
||||
CC: Mark Wu <wudxw@linux.vnet.ibm.com>
|
||||
CC: "David S. Miller" <davem@davemloft.net>
|
||||
Reported-by: Mark Wu <wudxw@linux.vnet.ibm.com>
|
||||
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
|
||||
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
|
||||
index 55bbb8b..e883bfe 100644
|
||||
--- a/drivers/net/bonding/bond_main.c
|
||||
+++ b/drivers/net/bonding/bond_main.c
|
||||
@@ -1724,6 +1724,7 @@ static int __bond_release_one(struct net_device *bond_dev,
|
||||
struct bonding *bond = netdev_priv(bond_dev);
|
||||
struct slave *slave, *oldcurrent;
|
||||
struct sockaddr addr;
|
||||
+ int old_flags = bond_dev->flags;
|
||||
netdev_features_t old_features = bond_dev->features;
|
||||
|
||||
/* slave is not a slave or master is not master of this slave */
|
||||
@@ -1855,12 +1856,18 @@ static int __bond_release_one(struct net_device *bond_dev,
|
||||
* bond_change_active_slave(..., NULL)
|
||||
*/
|
||||
if (!USES_PRIMARY(bond->params.mode)) {
|
||||
- /* unset promiscuity level from slave */
|
||||
- if (bond_dev->flags & IFF_PROMISC)
|
||||
+ /* unset promiscuity level from slave
|
||||
+ * NOTE: The NETDEV_CHANGEADDR call above may change the value
|
||||
+ * of the IFF_PROMISC flag in the bond_dev, but we need the
|
||||
+ * value of that flag before that change, as that was the value
|
||||
+ * when this slave was attached, so we cache at the start of the
|
||||
+ * function and use it here. Same goes for ALLMULTI below
|
||||
+ */
|
||||
+ if (old_flags & IFF_PROMISC)
|
||||
dev_set_promiscuity(slave_dev, -1);
|
||||
|
||||
/* unset allmulti level from slave */
|
||||
- if (bond_dev->flags & IFF_ALLMULTI)
|
||||
+ if (old_flags & IFF_ALLMULTI)
|
||||
dev_set_allmulti(slave_dev, -1);
|
||||
|
||||
bond_hw_addr_flush(bond_dev, slave_dev);
|
|
@ -780,6 +780,9 @@ Patch25116: hwmon-applesmc-Check-key-count-before-proceeding.patch
|
|||
#rhbz 974072
|
||||
Patch25117: rt2800-add-support-for-rf3070.patch
|
||||
|
||||
#rhbz 1005567
|
||||
Patch25118: bonding-driver-promisc.patch
|
||||
|
||||
# END OF PATCH DEFINITIONS
|
||||
|
||||
%endif
|
||||
|
@ -1508,6 +1511,9 @@ ApplyPatch hwmon-applesmc-Check-key-count-before-proceeding.patch
|
|||
#rhbz 974072
|
||||
ApplyPatch rt2800-add-support-for-rf3070.patch
|
||||
|
||||
#rhbz 1005567
|
||||
ApplyPatch bonding-driver-promisc.patch
|
||||
|
||||
# END OF PATCH APPLICATIONS
|
||||
|
||||
%endif
|
||||
|
@ -2320,6 +2326,9 @@ fi
|
|||
# and build.
|
||||
|
||||
%changelog
|
||||
* Wed Oct 02 2013 Neil Horman <nhorman@redhat.com>
|
||||
- Add promiscuity fix for vlans plus bonding (rhbz 1005567)
|
||||
|
||||
* Mon Sep 30 2013 Josh Boyer <jwboyer@fedoraproject.org>
|
||||
- Add support for rf3070 devices from Stanislaw Gruszka (rhbz 974072)
|
||||
- Drop VC_MUTE patch (rhbz 859485)
|
||||
|
|
Loading…
Reference in New Issue