diff options
author | Bart Van Assche <bart.vanassche@sandisk.com> | 2017-06-20 11:15:40 -0700 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2017-06-20 19:27:14 -0600 |
commit | d280bab305431c1836423f3cd6a5ff0e35a601ef (patch) | |
tree | 4558fa31acab72d04ca97b927cda6058be3921af /block | |
parent | cd6ce1482fd9e691bb68c660fa918c90f6b1bc25 (diff) | |
download | linux-stable-d280bab305431c1836423f3cd6a5ff0e35a601ef.tar.gz linux-stable-d280bab305431c1836423f3cd6a5ff0e35a601ef.tar.bz2 linux-stable-d280bab305431c1836423f3cd6a5ff0e35a601ef.zip |
block: Introduce request_queue.initialize_rq_fn()
Several block drivers need to initialize the driver-private request
data after having called blk_get_request() and before .prep_rq_fn()
is called, e.g. when submitting a REQ_OP_SCSI_* request. Avoid that
that initialization code has to be repeated after every
blk_get_request() call by adding new callback functions to struct
request_queue and to struct blk_mq_ops.
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Hannes Reinecke <hare@suse.com>
Cc: Omar Sandoval <osandov@fb.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block')
-rw-r--r-- | block/blk-core.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/block/blk-core.c b/block/blk-core.c index 21f6f1020303..09989028616f 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1372,12 +1372,21 @@ static struct request *blk_old_get_request(struct request_queue *q, struct request *blk_get_request(struct request_queue *q, unsigned int op, gfp_t gfp_mask) { - if (q->mq_ops) - return blk_mq_alloc_request(q, op, + struct request *req; + + if (q->mq_ops) { + req = blk_mq_alloc_request(q, op, (gfp_mask & __GFP_DIRECT_RECLAIM) ? 0 : BLK_MQ_REQ_NOWAIT); - else - return blk_old_get_request(q, op, gfp_mask); + if (!IS_ERR(req) && q->mq_ops->initialize_rq_fn) + q->mq_ops->initialize_rq_fn(req); + } else { + req = blk_old_get_request(q, op, gfp_mask); + if (!IS_ERR(req) && q->initialize_rq_fn) + q->initialize_rq_fn(req); + } + + return req; } EXPORT_SYMBOL(blk_get_request); |