diff options
-rw-r--r-- | drivers/net/bonding/bond_main.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 73313318399c..2359478b977f 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -2612,11 +2612,13 @@ static void bond_loadbalance_arp_mon(struct bonding *bond) | |||
2612 | bond_for_each_slave_rcu(bond, slave, iter) { | 2612 | bond_for_each_slave_rcu(bond, slave, iter) { |
2613 | unsigned long trans_start = dev_trans_start(slave->dev); | 2613 | unsigned long trans_start = dev_trans_start(slave->dev); |
2614 | 2614 | ||
2615 | slave->new_link = BOND_LINK_NOCHANGE; | ||
2616 | |||
2615 | if (slave->link != BOND_LINK_UP) { | 2617 | if (slave->link != BOND_LINK_UP) { |
2616 | if (bond_time_in_interval(bond, trans_start, 1) && | 2618 | if (bond_time_in_interval(bond, trans_start, 1) && |
2617 | bond_time_in_interval(bond, slave->last_rx, 1)) { | 2619 | bond_time_in_interval(bond, slave->last_rx, 1)) { |
2618 | 2620 | ||
2619 | slave->link = BOND_LINK_UP; | 2621 | slave->new_link = BOND_LINK_UP; |
2620 | slave_state_changed = 1; | 2622 | slave_state_changed = 1; |
2621 | 2623 | ||
2622 | /* primary_slave has no meaning in round-robin | 2624 | /* primary_slave has no meaning in round-robin |
@@ -2643,7 +2645,7 @@ static void bond_loadbalance_arp_mon(struct bonding *bond) | |||
2643 | if (!bond_time_in_interval(bond, trans_start, 2) || | 2645 | if (!bond_time_in_interval(bond, trans_start, 2) || |
2644 | !bond_time_in_interval(bond, slave->last_rx, 2)) { | 2646 | !bond_time_in_interval(bond, slave->last_rx, 2)) { |
2645 | 2647 | ||
2646 | slave->link = BOND_LINK_DOWN; | 2648 | slave->new_link = BOND_LINK_DOWN; |
2647 | slave_state_changed = 1; | 2649 | slave_state_changed = 1; |
2648 | 2650 | ||
2649 | if (slave->link_failure_count < UINT_MAX) | 2651 | if (slave->link_failure_count < UINT_MAX) |
@@ -2674,6 +2676,11 @@ static void bond_loadbalance_arp_mon(struct bonding *bond) | |||
2674 | if (!rtnl_trylock()) | 2676 | if (!rtnl_trylock()) |
2675 | goto re_arm; | 2677 | goto re_arm; |
2676 | 2678 | ||
2679 | bond_for_each_slave(bond, slave, iter) { | ||
2680 | if (slave->new_link != BOND_LINK_NOCHANGE) | ||
2681 | slave->link = slave->new_link; | ||
2682 | } | ||
2683 | |||
2677 | if (slave_state_changed) { | 2684 | if (slave_state_changed) { |
2678 | bond_slave_state_change(bond); | 2685 | bond_slave_state_change(bond); |
2679 | if (BOND_MODE(bond) == BOND_MODE_XOR) | 2686 | if (BOND_MODE(bond) == BOND_MODE_XOR) |