drbd: Do not mod_timer() with a past time
authorPhilipp Reisner <philipp.reisner@linbit.com>
Fri, 15 Jul 2011 11:53:06 +0000 (13:53 +0200)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Thu, 8 Nov 2012 15:57:57 +0000 (16:57 +0100)
In case we can not find out why the request takes too long
(happens e.g. when IO got suspended on DRBD level). rearm
the timer with a reasonable value.

Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
drivers/block/drbd/drbd_req.c

index 8fa51cda3b7e0b4d14d5db0a1bc17b76b9b1026b..d0f73b3a6796acbe88d229169cd1f6adb2aa7a71 100644 (file)
@@ -1083,7 +1083,7 @@ void request_timer_fn(unsigned long data)
        struct drbd_request *req; /* oldest request */
        struct list_head *le;
        struct net_conf *nc;
-       unsigned long ent = 0, dt = 0, et; /* effective timeout = ko_count * timeout */
+       unsigned long ent = 0, dt = 0, et, nt; /* effective timeout = ko_count * timeout */
 
        rcu_read_lock();
        nc = rcu_dereference(tconn->net_conf);
@@ -1122,6 +1122,7 @@ void request_timer_fn(unsigned long data)
                        __drbd_chk_io_error(mdev, 1);
                }
        }
+       nt = (time_is_before_eq_jiffies(req->start_time + et) ? jiffies : req->start_time) + et;
        spin_unlock_irq(&tconn->req_lock);
-       mod_timer(&mdev->request_timer, req->start_time + et);
+       mod_timer(&mdev->request_timer, nt);
 }