From 93f5afe9560b80e03a58ba5324ec71124df7655f Mon Sep 17 00:00:00 2001 From: Philipp Reisner Date: Thu, 23 Feb 2012 12:18:11 +0100 Subject: [PATCH] drbd: If disk timeout expires fail only the affected volume ...and not all volumes of the resource Signed-off-by: Philipp Reisner Signed-off-by: Lars Ellenberg --- drivers/block/drbd/drbd_req.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c index e9a2f238b897..4737ad1f94bb 100644 --- a/drivers/block/drbd/drbd_req.c +++ b/drivers/block/drbd/drbd_req.c @@ -1153,6 +1153,7 @@ void request_timer_fn(unsigned long data) struct drbd_conf *mdev = (struct drbd_conf *) data; struct drbd_tconn *tconn = mdev->tconn; struct drbd_request *req; /* oldest request */ + struct block_device *bdev; struct list_head *le; struct net_conf *nc; unsigned long ent = 0, dt = 0, et, nt; /* effective timeout = ko_count * timeout */ @@ -1163,6 +1164,7 @@ void request_timer_fn(unsigned long data) if (get_ldev(mdev)) { dt = rcu_dereference(mdev->ldev->disk_conf)->disk_timeout * HZ / 10; + bdev = mdev->ldev->backing_bdev; put_ldev(mdev); } rcu_read_unlock(); @@ -1188,7 +1190,7 @@ void request_timer_fn(unsigned long data) _drbd_set_state(_NS(mdev, conn, C_TIMEOUT), CS_VERBOSE | CS_HARD, NULL); } } - if (dt && req->rq_state & RQ_LOCAL_PENDING) { + if (dt && req->rq_state & RQ_LOCAL_PENDING && req->private_bio->bi_bdev == bdev) { if (time_is_before_eq_jiffies(req->start_time + dt)) { dev_warn(DEV, "Local backing device failed to meet the disk-timeout\n"); __drbd_chk_io_error(mdev, 1);