Consumers of the block layer shouldn't have to care if a driver uses
blk-mq or not, so make blk_get/put_request call the mq equivalents
underneath.

Signed-off-by: Christoph Hellwig <h...@lst.de>
---
 block/blk-core.c                  |   31 ++++++++++++++++++++-----------
 block/blk-mq.c                    |    1 -
 drivers/block/mtip32xx/mtip32xx.c |    2 +-
 3 files changed, 21 insertions(+), 13 deletions(-)

diff --git a/block/blk-core.c b/block/blk-core.c
index 5620e58..6d7fd79 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -1080,7 +1080,8 @@ retry:
        goto retry;
 }
 
-struct request *blk_get_request(struct request_queue *q, int rw, gfp_t 
gfp_mask)
+static struct request *blk_old_get_request(struct request_queue *q, int rw,
+               gfp_t gfp_mask)
 {
        struct request *rq;
 
@@ -1097,6 +1098,14 @@ struct request *blk_get_request(struct request_queue *q, 
int rw, gfp_t gfp_mask)
 
        return rq;
 }
+
+struct request *blk_get_request(struct request_queue *q, int rw, gfp_t 
gfp_mask)
+{
+       if (q->mq_ops)
+               return blk_mq_alloc_request(q, rw, gfp_mask);
+       else
+               return blk_old_get_request(q, rw, gfp_mask);
+}
 EXPORT_SYMBOL(blk_get_request);
 
 /**
@@ -1133,12 +1142,7 @@ EXPORT_SYMBOL(blk_get_request);
 struct request *blk_make_request(struct request_queue *q, struct bio *bio,
                                 gfp_t gfp_mask)
 {
-       struct request *rq;
-
-       if (q->mq_ops)
-               rq = blk_mq_alloc_request(q, bio_data_dir(bio), gfp_mask);
-       else
-               rq = blk_get_request(q, bio_data_dir(bio), gfp_mask);
+       struct request *rq = blk_get_request(q, bio_data_dir(bio), gfp_mask);
 
        if (unlikely(!rq))
                return ERR_PTR(-ENOMEM);
@@ -1276,12 +1280,17 @@ EXPORT_SYMBOL_GPL(__blk_put_request);
 
 void blk_put_request(struct request *req)
 {
-       unsigned long flags;
        struct request_queue *q = req->q;
 
-       spin_lock_irqsave(q->queue_lock, flags);
-       __blk_put_request(q, req);
-       spin_unlock_irqrestore(q->queue_lock, flags);
+       if (q->mq_ops)
+               blk_mq_free_request(req);
+       else {
+               unsigned long flags;
+
+               spin_lock_irqsave(q->queue_lock, flags);
+               __blk_put_request(q, req);
+               spin_unlock_irqrestore(q->queue_lock, flags);
+       }
 }
 EXPORT_SYMBOL(blk_put_request);
 
diff --git a/block/blk-mq.c b/block/blk-mq.c
index 423089d..709747f 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -268,7 +268,6 @@ void blk_mq_free_request(struct request *rq)
        hctx = q->mq_ops->map_queue(q, ctx->cpu);
        __blk_mq_free_request(hctx, ctx, rq);
 }
-EXPORT_SYMBOL(blk_mq_free_request);
 
 void blk_mq_finish_request(struct request *rq, int error)
 {
diff --git a/drivers/block/mtip32xx/mtip32xx.c 
b/drivers/block/mtip32xx/mtip32xx.c
index 4427178..3c4c668 100644
--- a/drivers/block/mtip32xx/mtip32xx.c
+++ b/drivers/block/mtip32xx/mtip32xx.c
@@ -158,7 +158,7 @@ static struct mtip_cmd *mtip_get_int_command(struct 
driver_data *dd)
 
 static void mtip_put_int_command(struct driver_data *dd, struct mtip_cmd *cmd)
 {
-       blk_mq_free_request(blk_mq_rq_from_pdu(cmd));
+       blk_put_request(blk_mq_rq_from_pdu(cmd));
 }
 
 /*
-- 
1.7.10.4


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
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