Commit 3b03ad59 authored by Philipp Reisner's avatar Philipp Reisner

drbd: Do not mod_timer() with a past time

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: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: default avatarLars Ellenberg <lars.ellenberg@linbit.com>
parent 3fb4746d
...@@ -1083,7 +1083,7 @@ void request_timer_fn(unsigned long data) ...@@ -1083,7 +1083,7 @@ void request_timer_fn(unsigned long data)
struct drbd_request *req; /* oldest request */ struct drbd_request *req; /* oldest request */
struct list_head *le; struct list_head *le;
struct net_conf *nc; 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(); rcu_read_lock();
nc = rcu_dereference(tconn->net_conf); nc = rcu_dereference(tconn->net_conf);
...@@ -1122,6 +1122,7 @@ void request_timer_fn(unsigned long data) ...@@ -1122,6 +1122,7 @@ void request_timer_fn(unsigned long data)
__drbd_chk_io_error(mdev, 1); __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); spin_unlock_irq(&tconn->req_lock);
mod_timer(&mdev->request_timer, req->start_time + et); mod_timer(&mdev->request_timer, nt);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment