[dm-devel] [PATCH 9/9] dm path selector: Avoid that device removal triggers an infinite loop
Bart Van Assche
bart.vanassche at sandisk.com
Wed Aug 31 22:18:31 UTC 2016
If pg_init_retries is set and a request is queued against a
multipath device with all underlying block devices in the "dying"
state then an infinite loop is triggered because activate_path()
never succeeds and hence never calls pg_init_done(). Fix this by
making ql_select_path() skip dying paths.
Signed-off-by: Bart Van Assche <bart.vanassche at sandisk.com>
---
drivers/md/dm-queue-length.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/md/dm-queue-length.c b/drivers/md/dm-queue-length.c
index 23f1786..a283c66 100644
--- a/drivers/md/dm-queue-length.c
+++ b/drivers/md/dm-queue-length.c
@@ -199,11 +199,12 @@ static struct dm_path *ql_select_path(struct path_selector *ps, size_t nr_bytes)
list_move_tail(s->valid_paths.next, &s->valid_paths);
list_for_each_entry(pi, &s->valid_paths, list) {
- if (!best ||
- (atomic_read(&pi->qlen) < atomic_read(&best->qlen)))
+ if ((!best ||
+ atomic_read(&pi->qlen) < atomic_read(&best->qlen)) &&
+ !blk_queue_dying(pi->path->dev->bdev->bd_queue))
best = pi;
- if (!atomic_read(&best->qlen))
+ if (best && atomic_read(&best->qlen) == 0)
break;
}
--
2.9.3
More information about the dm-devel
mailing list