bonding: Fix time comparison
authorDavid Sterba <dsterba@suse.cz>
Fri, 7 Dec 2007 07:40:33 +0000 (23:40 -0800)
committerJeff Garzik <jeff@garzik.org>
Fri, 7 Dec 2007 20:00:30 +0000 (15:00 -0500)
From: David Sterba <dsterba@suse.cz>

Use macros for comparing jiffies. Jiffies' wrap caused missed events and hangs.
Module reinsert was needed to make bonding work again.

Signed-off-by: David Sterba <dsterba@suse.cz>
Acked-by: Jay Vosburgh <fubar@us.ibm.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
drivers/net/bonding/bond_main.c

index 423298c..e4a4714 100644 (file)
@@ -74,6 +74,7 @@
 #include <linux/ethtool.h>
 #include <linux/if_vlan.h>
 #include <linux/if_bonding.h>
+#include <linux/jiffies.h>
 #include <net/route.h>
 #include <net/net_namespace.h>
 #include "bonding.h"
@@ -2722,8 +2723,8 @@ void bond_loadbalance_arp_mon(struct work_struct *work)
         */
        bond_for_each_slave(bond, slave, i) {
                if (slave->link != BOND_LINK_UP) {
-                       if (((jiffies - slave->dev->trans_start) <= delta_in_ticks) &&
-                           ((jiffies - slave->dev->last_rx) <= delta_in_ticks)) {
+                       if (time_before_eq(jiffies, slave->dev->trans_start + delta_in_ticks) &&
+                           time_before_eq(jiffies, slave->dev->last_rx + delta_in_ticks)) {
 
                                slave->link  = BOND_LINK_UP;
                                slave->state = BOND_STATE_ACTIVE;
@@ -2754,8 +2755,8 @@ void bond_loadbalance_arp_mon(struct work_struct *work)
                         * when the source ip is 0, so don't take the link down
                         * if we don't know our ip yet
                         */
-                       if (((jiffies - slave->dev->trans_start) >= (2*delta_in_ticks)) ||
-                           (((jiffies - slave->dev->last_rx) >= (2*delta_in_ticks)) &&
+                       if (time_after_eq(jiffies, slave->dev->trans_start + 2*delta_in_ticks) ||
+                           (time_after_eq(jiffies, slave->dev->last_rx + 2*delta_in_ticks) &&
                             bond_has_ip(bond))) {
 
                                slave->link  = BOND_LINK_DOWN;
@@ -2848,8 +2849,8 @@ void bond_activebackup_arp_mon(struct work_struct *work)
         */
        bond_for_each_slave(bond, slave, i) {
                if (slave->link != BOND_LINK_UP) {
-                       if ((jiffies - slave_last_rx(bond, slave)) <=
-                            delta_in_ticks) {
+                       if (time_before_eq(jiffies,
+                           slave_last_rx(bond, slave) + delta_in_ticks)) {
 
                                slave->link = BOND_LINK_UP;
 
@@ -2858,7 +2859,7 @@ void bond_activebackup_arp_mon(struct work_struct *work)
                                write_lock_bh(&bond->curr_slave_lock);
 
                                if ((!bond->curr_active_slave) &&
-                                   ((jiffies - slave->dev->trans_start) <= delta_in_ticks)) {
+                                   time_before_eq(jiffies, slave->dev->trans_start + delta_in_ticks)) {
                                        bond_change_active_slave(bond, slave);
                                        bond->current_arp_slave = NULL;
                                } else if (bond->curr_active_slave != slave) {
@@ -2897,7 +2898,7 @@ void bond_activebackup_arp_mon(struct work_struct *work)
 
                        if ((slave != bond->curr_active_slave) &&
                            (!bond->current_arp_slave) &&
-                           (((jiffies - slave_last_rx(bond, slave)) >= 3*delta_in_ticks) &&
+                           (time_after_eq(jiffies, slave_last_rx(bond, slave) + 3*delta_in_ticks) &&
                             bond_has_ip(bond))) {
                                /* a backup slave has gone down; three times
                                 * the delta allows the current slave to be
@@ -2943,10 +2944,10 @@ void bond_activebackup_arp_mon(struct work_struct *work)
                 * before being taken out. if a primary is being used, check
                 * if it is up and needs to take over as the curr_active_slave
                 */
-               if ((((jiffies - slave->dev->trans_start) >= (2*delta_in_ticks)) ||
-           (((jiffies - slave_last_rx(bond, slave)) >= (2*delta_in_ticks)) &&
-            bond_has_ip(bond))) &&
-                   ((jiffies - slave->jiffies) >= 2*delta_in_ticks)) {
+               if ((time_after_eq(jiffies, slave->dev->trans_start + 2*delta_in_ticks) ||
+                       (time_after_eq(jiffies, slave_last_rx(bond, slave) + 2*delta_in_ticks) &&
+                        bond_has_ip(bond))) &&
+                       time_after_eq(jiffies, slave->jiffies + 2*delta_in_ticks)) {
 
                        slave->link  = BOND_LINK_DOWN;