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 <[email protected]>
---
 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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to