Commit 218b6e82 authored by Jarod Wilson's avatar Jarod Wilson Committed by Greg Kroah-Hartman

bonding/802.3ad: fix link_failure_count tracking

commit ea53abfa upstream.

Commit 4d2c0cda set slave->link to
BOND_LINK_DOWN for 802.3ad bonds whenever invalid speed/duplex values
were read, to fix a problem with slaves getting into weird states, but
in the process, broke tracking of link failures, as going straight to
BOND_LINK_DOWN when a link is indeed down (cable pulled, switch rebooted)
means we broke out of bond_miimon_inspect()'s BOND_LINK_DOWN case because
!link_state was already true, we never incremented commit, and never got
a chance to call bond_miimon_commit(), where slave->link_failure_count
would be incremented. I believe the simple fix here is to mark the slave
as BOND_LINK_FAIL, and let bond_miimon_inspect() transition the link from
_FAIL to either _UP or _DOWN, and in the latter case, we now get proper
incrementing of link_failure_count again.

Fixes: 4d2c0cda ("bonding: speed/duplex update at NETDEV_UP event")
CC: Mahesh Bandewar <maheshb@google.com>
CC: David S. Miller <davem@davemloft.net>
CC: netdev@vger.kernel.org
CC: stable@vger.kernel.org
Signed-off-by: default avatarJarod Wilson <jarod@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 9333523b
...@@ -3111,13 +3111,13 @@ static int bond_slave_netdev_event(unsigned long event, ...@@ -3111,13 +3111,13 @@ static int bond_slave_netdev_event(unsigned long event,
case NETDEV_CHANGE: case NETDEV_CHANGE:
/* For 802.3ad mode only: /* For 802.3ad mode only:
* Getting invalid Speed/Duplex values here will put slave * Getting invalid Speed/Duplex values here will put slave
* in weird state. So mark it as link-down for the time * in weird state. So mark it as link-fail for the time
* being and let link-monitoring (miimon) set it right when * being and let link-monitoring (miimon) set it right when
* correct speeds/duplex are available. * correct speeds/duplex are available.
*/ */
if (bond_update_speed_duplex(slave) && if (bond_update_speed_duplex(slave) &&
BOND_MODE(bond) == BOND_MODE_8023AD) BOND_MODE(bond) == BOND_MODE_8023AD)
slave->link = BOND_LINK_DOWN; slave->link = BOND_LINK_FAIL;
if (BOND_MODE(bond) == BOND_MODE_8023AD) if (BOND_MODE(bond) == BOND_MODE_8023AD)
bond_3ad_adapter_speed_duplex_changed(slave); bond_3ad_adapter_speed_duplex_changed(slave);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment