diff options
author | Arnd Bergmann <arnd@arndb.de> | 2011-10-20 12:30:25 -0400 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2011-10-20 12:30:25 -0400 |
commit | 995a0605a6665858d73f9e80053414909be33f27 (patch) | |
tree | fcc66a6a77acdaae492f77c0c58c0233db74a2b4 /drivers/net/bonding/bond_main.c | |
parent | a32750c2ca6f697903b19063fc86f4272865e3a1 (diff) | |
parent | 677d3e2f07d1b3d6d2f76fd5552d16a53b9236a0 (diff) |
Merge branch 'at91/trng' into next/driver
Diffstat (limited to 'drivers/net/bonding/bond_main.c')
-rw-r--r-- | drivers/net/bonding/bond_main.c | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 38a83acd502e..6d79b78cfc75 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -777,6 +777,9 @@ static void bond_resend_igmp_join_requests(struct bonding *bond) | |||
777 | 777 | ||
778 | read_lock(&bond->lock); | 778 | read_lock(&bond->lock); |
779 | 779 | ||
780 | if (bond->kill_timers) | ||
781 | goto out; | ||
782 | |||
780 | /* rejoin all groups on bond device */ | 783 | /* rejoin all groups on bond device */ |
781 | __bond_resend_igmp_join_requests(bond->dev); | 784 | __bond_resend_igmp_join_requests(bond->dev); |
782 | 785 | ||
@@ -790,9 +793,9 @@ static void bond_resend_igmp_join_requests(struct bonding *bond) | |||
790 | __bond_resend_igmp_join_requests(vlan_dev); | 793 | __bond_resend_igmp_join_requests(vlan_dev); |
791 | } | 794 | } |
792 | 795 | ||
793 | if (--bond->igmp_retrans > 0) | 796 | if ((--bond->igmp_retrans > 0) && !bond->kill_timers) |
794 | queue_delayed_work(bond->wq, &bond->mcast_work, HZ/5); | 797 | queue_delayed_work(bond->wq, &bond->mcast_work, HZ/5); |
795 | 798 | out: | |
796 | read_unlock(&bond->lock); | 799 | read_unlock(&bond->lock); |
797 | } | 800 | } |
798 | 801 | ||
@@ -2538,7 +2541,7 @@ void bond_mii_monitor(struct work_struct *work) | |||
2538 | } | 2541 | } |
2539 | 2542 | ||
2540 | re_arm: | 2543 | re_arm: |
2541 | if (bond->params.miimon) | 2544 | if (bond->params.miimon && !bond->kill_timers) |
2542 | queue_delayed_work(bond->wq, &bond->mii_work, | 2545 | queue_delayed_work(bond->wq, &bond->mii_work, |
2543 | msecs_to_jiffies(bond->params.miimon)); | 2546 | msecs_to_jiffies(bond->params.miimon)); |
2544 | out: | 2547 | out: |
@@ -2886,7 +2889,7 @@ void bond_loadbalance_arp_mon(struct work_struct *work) | |||
2886 | } | 2889 | } |
2887 | 2890 | ||
2888 | re_arm: | 2891 | re_arm: |
2889 | if (bond->params.arp_interval) | 2892 | if (bond->params.arp_interval && !bond->kill_timers) |
2890 | queue_delayed_work(bond->wq, &bond->arp_work, delta_in_ticks); | 2893 | queue_delayed_work(bond->wq, &bond->arp_work, delta_in_ticks); |
2891 | out: | 2894 | out: |
2892 | read_unlock(&bond->lock); | 2895 | read_unlock(&bond->lock); |
@@ -3154,7 +3157,7 @@ void bond_activebackup_arp_mon(struct work_struct *work) | |||
3154 | bond_ab_arp_probe(bond); | 3157 | bond_ab_arp_probe(bond); |
3155 | 3158 | ||
3156 | re_arm: | 3159 | re_arm: |
3157 | if (bond->params.arp_interval) | 3160 | if (bond->params.arp_interval && !bond->kill_timers) |
3158 | queue_delayed_work(bond->wq, &bond->arp_work, delta_in_ticks); | 3161 | queue_delayed_work(bond->wq, &bond->arp_work, delta_in_ticks); |
3159 | out: | 3162 | out: |
3160 | read_unlock(&bond->lock); | 3163 | read_unlock(&bond->lock); |
@@ -3419,9 +3422,27 @@ static int bond_xmit_hash_policy_l2(struct sk_buff *skb, int count) | |||
3419 | static int bond_open(struct net_device *bond_dev) | 3422 | static int bond_open(struct net_device *bond_dev) |
3420 | { | 3423 | { |
3421 | struct bonding *bond = netdev_priv(bond_dev); | 3424 | struct bonding *bond = netdev_priv(bond_dev); |
3425 | struct slave *slave; | ||
3426 | int i; | ||
3422 | 3427 | ||
3423 | bond->kill_timers = 0; | 3428 | bond->kill_timers = 0; |
3424 | 3429 | ||
3430 | /* reset slave->backup and slave->inactive */ | ||
3431 | read_lock(&bond->lock); | ||
3432 | if (bond->slave_cnt > 0) { | ||
3433 | read_lock(&bond->curr_slave_lock); | ||
3434 | bond_for_each_slave(bond, slave, i) { | ||
3435 | if ((bond->params.mode == BOND_MODE_ACTIVEBACKUP) | ||
3436 | && (slave != bond->curr_active_slave)) { | ||
3437 | bond_set_slave_inactive_flags(slave); | ||
3438 | } else { | ||
3439 | bond_set_slave_active_flags(slave); | ||
3440 | } | ||
3441 | } | ||
3442 | read_unlock(&bond->curr_slave_lock); | ||
3443 | } | ||
3444 | read_unlock(&bond->lock); | ||
3445 | |||
3425 | INIT_DELAYED_WORK(&bond->mcast_work, bond_resend_igmp_join_requests_delayed); | 3446 | INIT_DELAYED_WORK(&bond->mcast_work, bond_resend_igmp_join_requests_delayed); |
3426 | 3447 | ||
3427 | if (bond_is_lb(bond)) { | 3448 | if (bond_is_lb(bond)) { |