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: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
This commit is contained in:
parent
3fb4746d8d
commit
3b03ad5929
1 changed files with 3 additions and 2 deletions
|
@ -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)
|
||||||
__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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue