diff options
author | Christoph Hellwig <hch@lst.de> | 2016-07-19 05:31:53 -0400 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2016-07-20 19:38:35 -0400 |
commit | 4613c5f1df92f3cb5a8f89c7dfefc37402c16bd8 (patch) | |
tree | e31b141cd7540e79c4d0bc199f5a4a71db261b69 /block | |
parent | dd9cf04611c566f980638ec0c592c38ea5d463ce (diff) |
scsi/osd: open code blk_make_request
I wish the OSD code could simply use blk_rq_map_* helpers like
everyone else, but the complex nature of deciding if we have
DATA IN and/or DATA OUT buffers might make this impossible
(at least for a mere human like me).
But using blk_rq_append_bio at least allows sharing the setup code
between request with or without dat a buffers, and given that this
is the last user of blk_make_request it allows getting rid of that
somewhat awkward interface.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Boaz Harrosh <ooo@electrozaur.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'block')
-rw-r--r-- | block/blk-core.c | 57 |
1 files changed, 0 insertions, 57 deletions
diff --git a/block/blk-core.c b/block/blk-core.c index a2230186c36d..91b339f4d2ad 100644 --- a/block/blk-core.c +++ b/block/blk-core.c | |||
@@ -1318,63 +1318,6 @@ struct request *blk_get_request(struct request_queue *q, int rw, gfp_t gfp_mask) | |||
1318 | EXPORT_SYMBOL(blk_get_request); | 1318 | EXPORT_SYMBOL(blk_get_request); |
1319 | 1319 | ||
1320 | /** | 1320 | /** |
1321 | * blk_make_request - given a bio, allocate a corresponding struct request. | ||
1322 | * @q: target request queue | ||
1323 | * @bio: The bio describing the memory mappings that will be submitted for IO. | ||
1324 | * It may be a chained-bio properly constructed by block/bio layer. | ||
1325 | * @gfp_mask: gfp flags to be used for memory allocation | ||
1326 | * | ||
1327 | * blk_make_request is the parallel of generic_make_request for BLOCK_PC | ||
1328 | * type commands. Where the struct request needs to be farther initialized by | ||
1329 | * the caller. It is passed a &struct bio, which describes the memory info of | ||
1330 | * the I/O transfer. | ||
1331 | * | ||
1332 | * The caller of blk_make_request must make sure that bi_io_vec | ||
1333 | * are set to describe the memory buffers. That bio_data_dir() will return | ||
1334 | * the needed direction of the request. (And all bio's in the passed bio-chain | ||
1335 | * are properly set accordingly) | ||
1336 | * | ||
1337 | * If called under none-sleepable conditions, mapped bio buffers must not | ||
1338 | * need bouncing, by calling the appropriate masked or flagged allocator, | ||
1339 | * suitable for the target device. Otherwise the call to blk_queue_bounce will | ||
1340 | * BUG. | ||
1341 | * | ||
1342 | * WARNING: When allocating/cloning a bio-chain, careful consideration should be | ||
1343 | * given to how you allocate bios. In particular, you cannot use | ||
1344 | * __GFP_DIRECT_RECLAIM for anything but the first bio in the chain. Otherwise | ||
1345 | * you risk waiting for IO completion of a bio that hasn't been submitted yet, | ||
1346 | * thus resulting in a deadlock. Alternatively bios should be allocated using | ||
1347 | * bio_kmalloc() instead of bio_alloc(), as that avoids the mempool deadlock. | ||
1348 | * If possible a big IO should be split into smaller parts when allocation | ||
1349 | * fails. Partial allocation should not be an error, or you risk a live-lock. | ||
1350 | */ | ||
1351 | struct request *blk_make_request(struct request_queue *q, struct bio *bio, | ||
1352 | gfp_t gfp_mask) | ||
1353 | { | ||
1354 | struct request *rq = blk_get_request(q, bio_data_dir(bio), gfp_mask); | ||
1355 | |||
1356 | if (IS_ERR(rq)) | ||
1357 | return rq; | ||
1358 | |||
1359 | blk_rq_set_block_pc(rq); | ||
1360 | |||
1361 | for_each_bio(bio) { | ||
1362 | struct bio *bounce_bio = bio; | ||
1363 | int ret; | ||
1364 | |||
1365 | blk_queue_bounce(q, &bounce_bio); | ||
1366 | ret = blk_rq_append_bio(rq, bounce_bio); | ||
1367 | if (unlikely(ret)) { | ||
1368 | blk_put_request(rq); | ||
1369 | return ERR_PTR(ret); | ||
1370 | } | ||
1371 | } | ||
1372 | |||
1373 | return rq; | ||
1374 | } | ||
1375 | EXPORT_SYMBOL(blk_make_request); | ||
1376 | |||
1377 | /** | ||
1378 | * blk_rq_set_block_pc - initialize a request to type BLOCK_PC | 1321 | * blk_rq_set_block_pc - initialize a request to type BLOCK_PC |
1379 | * @rq: request to be initialized | 1322 | * @rq: request to be initialized |
1380 | * | 1323 | * |