|
@@ -296,17 +296,29 @@ struct request *blk_mq_alloc_request_hctx(struct request_queue *q, int rw,
|
|
|
if (ret)
|
|
|
return ERR_PTR(ret);
|
|
|
|
|
|
+ /*
|
|
|
+ * Check if the hardware context is actually mapped to anything.
|
|
|
+ * If not tell the caller that it should skip this queue.
|
|
|
+ */
|
|
|
hctx = q->queue_hw_ctx[hctx_idx];
|
|
|
+ if (!blk_mq_hw_queue_mapped(hctx)) {
|
|
|
+ ret = -EXDEV;
|
|
|
+ goto out_queue_exit;
|
|
|
+ }
|
|
|
ctx = __blk_mq_get_ctx(q, cpumask_first(hctx->cpumask));
|
|
|
|
|
|
blk_mq_set_alloc_data(&alloc_data, q, flags, ctx, hctx);
|
|
|
rq = __blk_mq_alloc_request(&alloc_data, rw, 0);
|
|
|
if (!rq) {
|
|
|
- blk_queue_exit(q);
|
|
|
- return ERR_PTR(-EWOULDBLOCK);
|
|
|
+ ret = -EWOULDBLOCK;
|
|
|
+ goto out_queue_exit;
|
|
|
}
|
|
|
|
|
|
return rq;
|
|
|
+
|
|
|
+out_queue_exit:
|
|
|
+ blk_queue_exit(q);
|
|
|
+ return ERR_PTR(ret);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(blk_mq_alloc_request_hctx);
|
|
|
|