|
@@ -533,8 +533,20 @@ static int multipath_clone_and_map(struct dm_target *ti, struct request *rq,
|
|
|
if (blk_queue_dying(q)) {
|
|
|
atomic_inc(&m->pg_init_in_progress);
|
|
|
activate_or_offline_path(pgpath);
|
|
|
+ return DM_MAPIO_DELAY_REQUEUE;
|
|
|
}
|
|
|
- return DM_MAPIO_DELAY_REQUEUE;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * blk-mq's SCHED_RESTART can cover this requeue, so we
|
|
|
+ * needn't deal with it by DELAY_REQUEUE. More importantly,
|
|
|
+ * we have to return DM_MAPIO_REQUEUE so that blk-mq can
|
|
|
+ * get the queue busy feedback (via BLK_STS_RESOURCE),
|
|
|
+ * otherwise I/O merging can suffer.
|
|
|
+ */
|
|
|
+ if (q->mq_ops)
|
|
|
+ return DM_MAPIO_REQUEUE;
|
|
|
+ else
|
|
|
+ return DM_MAPIO_DELAY_REQUEUE;
|
|
|
}
|
|
|
clone->bio = clone->biotail = NULL;
|
|
|
clone->rq_disk = bdev->bd_disk;
|