| From 93074a885074b1d70659fdaf53e36808bd0d2f4a Mon Sep 17 00:00:00 2001 |
| From: Roman Penyaev <rpenyaev@suse.de> |
| Date: Tue, 17 Dec 2019 16:54:07 +0100 |
| Subject: [PATCH] block: end bio with BLK_STS_AGAIN in case of non-mq devs and |
| REQ_NOWAIT |
| |
| commit c58c1f83436b501d45d4050fd1296d71a9760bcb upstream. |
| |
| Non-mq devs do not honor REQ_NOWAIT so give a chance to the caller to repeat |
| request gracefully on -EAGAIN error. |
| |
| The problem is well reproduced using io_uring: |
| |
| mkfs.ext4 /dev/ram0 |
| mount /dev/ram0 /mnt |
| |
| # Preallocate a file |
| dd if=/dev/zero of=/mnt/file bs=1M count=1 |
| |
| # Start fio with io_uring and get -EIO |
| fio --rw=write --ioengine=io_uring --size=1M --direct=1 --name=job --filename=/mnt/file |
| |
| Signed-off-by: Roman Penyaev <rpenyaev@suse.de> |
| Signed-off-by: Jens Axboe <axboe@kernel.dk> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/block/blk-core.c b/block/blk-core.c |
| index 5183fca0818a..48f417d0806d 100644 |
| --- a/block/blk-core.c |
| +++ b/block/blk-core.c |
| @@ -848,11 +848,14 @@ generic_make_request_checks(struct bio *bio) |
| } |
| |
| /* |
| - * For a REQ_NOWAIT based request, return -EOPNOTSUPP |
| - * if queue is not a request based queue. |
| + * Non-mq queues do not honor REQ_NOWAIT, so complete a bio |
| + * with BLK_STS_AGAIN status in order to catch -EAGAIN and |
| + * to give a chance to the caller to repeat request gracefully. |
| */ |
| - if ((bio->bi_opf & REQ_NOWAIT) && !queue_is_mq(q)) |
| - goto not_supported; |
| + if ((bio->bi_opf & REQ_NOWAIT) && !queue_is_mq(q)) { |
| + status = BLK_STS_AGAIN; |
| + goto end_io; |
| + } |
| |
| if (should_fail_bio(bio)) |
| goto end_io; |
| -- |
| 2.7.4 |
| |