blk-mq: bidi support
authorChristoph Hellwig <hch@lst.de>
Wed, 16 Apr 2014 07:44:53 +0000 (09:44 +0200)
committerJens Axboe <axboe@fb.com>
Wed, 16 Apr 2014 20:15:25 +0000 (14:15 -0600)
Add two unlinkely branches to make sure the resid is initialized correctly
for bidi request pairs, and the second request gets properly freed.

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

index 86d66e0e900c37cf0c7f270d27db5986596b932f..963a8210938624d3db05ca3d609791b25c7a356b 100644 (file)
@@ -298,10 +298,13 @@ inline void __blk_mq_end_io(struct request *rq, int error)
 {
        blk_account_io_done(rq);
 
-       if (rq->end_io)
+       if (rq->end_io) {
                rq->end_io(rq, error);
-       else
+       } else {
+               if (unlikely(blk_bidi_rq(rq)))
+                       blk_mq_free_request(rq->next_rq);
                blk_mq_free_request(rq);
+       }
 }
 EXPORT_SYMBOL(__blk_mq_end_io);
 
@@ -366,6 +369,8 @@ static void blk_mq_start_request(struct request *rq, bool last)
        trace_block_rq_issue(q, rq);
 
        rq->resid_len = blk_rq_bytes(rq);
+       if (unlikely(blk_bidi_rq(rq)))
+               rq->next_rq->resid_len = blk_rq_bytes(rq->next_rq);
 
        /*
         * Just mark start time and set the started bit. Due to memory