• Jay Vosburgh's avatar
    bonding: fix state transition issue in link monitoring · 1899bb32
    Jay Vosburgh authored
    Since de77ecd4 ("bonding: improve link-status update in
    mii-monitoring"), the bonding driver has utilized two separate variables
    to indicate the next link state a particular slave should transition to.
    Each is used to communicate to a different portion of the link state
    change commit logic; one to the bond_miimon_commit function itself, and
    another to the state transition logic.
    
    	Unfortunately, the two variables can become unsynchronized,
    resulting in incorrect link state transitions within bonding.  This can
    cause slaves to become stuck in an incorrect link state until a
    subsequent carrier state transition.
    
    	The issue occurs when a special case in bond_slave_netdev_event
    sets slave->link directly to BOND_LINK_FAIL.  On the next pass through
    bond_miimon_inspect after the slave goes carrier up, the BOND_LINK_FAIL
    case will set the proposed next state (link_new_state) to BOND_LINK_UP,
    but the new_link to BOND_LINK_DOWN.  The setting of the final link state
    from new_link comes after that from link_new_state, and so the slave
    will end up incorrectly in _DOWN state.
    
    	Resolve this by combining the two variables into one.
    Reported-by: default avatarAleksei Zakharov <zakharov.a.g@yandex.ru>
    Reported-by: default avatarSha Zhang <zhangsha.zhang@huawei.com>
    Cc: Mahesh Bandewar <maheshb@google.com>
    Fixes: de77ecd4 ("bonding: improve link-status update in mii-monitoring")
    Signed-off-by: default avatarJay Vosburgh <jay.vosburgh@canonical.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    1899bb32
bond_main.c 137 KB