blk-mq: dont assume rq->errors is set when returning an error from ->queue_rq
authorChristoph Hellwig <hch@infradead.org>
Tue, 11 Feb 2014 16:27:13 +0000 (08:27 -0800)
committerJens Axboe <axboe@fb.com>
Tue, 11 Feb 2014 16:34:07 +0000 (09:34 -0700)
rq->errors never has been part of the communication protocol between drivers
and the block stack and most drivers will not have initialized it.

Return -EIO to upper layers when the driver returns BLK_MQ_RQ_QUEUE_ERROR
unconditionally.  If a driver want to return a different error it can easily
do so by returning success after calling blk_mq_end_io itself.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@fb.com>
block/blk-mq.c

index a59b0565e940dfd3616f0f5439794c7995d5a5ee..0480710a8b45d58aef2bae1218e63a2de3ba1cb1 100644 (file)
@@ -605,8 +605,8 @@ static void __blk_mq_run_hw_queue(struct blk_mq_hw_ctx *hctx)
                        break;
                default:
                        pr_err("blk-mq: bad return on queue: %d\n", ret);
-                       rq->errors = -EIO;
                case BLK_MQ_RQ_QUEUE_ERROR:
+                       rq->errors = -EIO;
                        blk_mq_end_io(rq, rq->errors);
                        break;
                }