diff options
author | Jens Axboe <axboe@kernel.dk> | 2019-07-16 21:55:23 +0200 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2019-07-22 05:46:23 +0200 |
commit | 893a1c97205a3ece0cbb3f571a3b972080f3b4c7 (patch) | |
tree | 9173a99e83a6842a89b07fb7eeb26e816a0c8faa /block | |
parent | io_uring: add a memory barrier before atomic_read (diff) | |
download | linux-893a1c97205a3ece0cbb3f571a3b972080f3b4c7.tar.xz linux-893a1c97205a3ece0cbb3f571a3b972080f3b4c7.zip |
blk-mq: allow REQ_NOWAIT to return an error inline
By default, if a caller sets REQ_NOWAIT and we need to block, we'll
return -EAGAIN through the bio->bi_end_io() callback. For some use
cases, this makes it hard to use.
Allow a caller to ask for inline return of errors related to
blocking by also setting REQ_NOWAIT_INLINE.
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block')
-rw-r--r-- | block/blk-mq.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/block/blk-mq.c b/block/blk-mq.c index b038ec680e84..2bc2c0705660 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -1960,9 +1960,13 @@ static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio) rq = blk_mq_get_request(q, bio, &data); if (unlikely(!rq)) { rq_qos_cleanup(q, bio); - if (bio->bi_opf & REQ_NOWAIT) + + cookie = BLK_QC_T_NONE; + if (bio->bi_opf & REQ_NOWAIT_INLINE) + cookie = BLK_QC_T_EAGAIN; + else if (bio->bi_opf & REQ_NOWAIT) bio_wouldblock_error(bio); - return BLK_QC_T_NONE; + return cookie; } trace_block_getrq(q, bio, bio->bi_opf); |