Make sure we set bio errors correctly and don't complete bios midway through a flush sequence. Largely copied from the old I/O path. Signed-off-by: Christoph Hellwig --- block/blk-mq.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/block/blk-mq.c b/block/blk-mq.c index dece2e2..d2e568e 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -269,6 +269,21 @@ void blk_mq_free_request(struct request *rq) __blk_mq_free_request(hctx, ctx, rq); } +static void blk_mq_bio_endio(struct request *rq, struct bio *bio, int error) +{ + if (error) + clear_bit(BIO_UPTODATE, &bio->bi_flags); + else if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) + error = -EIO; + + if (unlikely(rq->cmd_flags & REQ_QUIET)) + set_bit(BIO_QUIET, &bio->bi_flags); + + /* don't actually finish bio if it's part of flush sequence */ + if (!(rq->cmd_flags & REQ_FLUSH_SEQ)) + bio_endio(bio, error); +} + void blk_mq_finish_request(struct request *rq, int error) { struct bio *bio = rq->bio; @@ -279,7 +294,7 @@ void blk_mq_finish_request(struct request *rq, int error) bio->bi_next = NULL; bytes += bio->bi_size; - bio_endio(bio, error); + blk_mq_bio_endio(rq, bio, error); bio = next; } -- 1.7.10.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/