mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-03-16 04:04:06 +00:00
io_uring: retry in case of short read on block device
[ Upstream commit7db304375e
] In case of buffered reading from block device, when short read happens, we should retry to read more, otherwise the IO will be completed partially, for example, the following fio expects to read 2MB, but it can only read 1M or less bytes: fio --name=onessd --filename=/dev/nvme0n1 --filesize=2M \ --rw=randread --bs=2M --direct=0 --overwrite=0 --numjobs=1 \ --iodepth=1 --time_based=0 --runtime=2 --ioengine=io_uring \ --registerfiles --fixedbufs --gtod_reduce=1 --group_reporting Fix the issue by allowing short read retry for block device, which sets FMODE_BUF_RASYNC really. Fixes:9a173346bd
("io_uring: fix short read retries for non-reg files") Cc: Pavel Begunkov <asml.silence@gmail.com> Signed-off-by: Ming Lei <ming.lei@redhat.com> Reviewed-by: Pavel Begunkov <asml.silence@gmail.com> Link: https://lore.kernel.org/r/20210821150751.1290434-1-ming.lei@redhat.com Signed-off-by: Jens Axboe <axboe@kernel.dk> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
e7009e8ecd
commit
fcf7264e87
1 changed files with 7 additions and 1 deletions
|
@ -3286,6 +3286,12 @@ static inline int io_iter_do_read(struct io_kiocb *req, struct iov_iter *iter)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
static bool need_read_all(struct io_kiocb *req)
|
||||
{
|
||||
return req->flags & REQ_F_ISREG ||
|
||||
S_ISBLK(file_inode(req->file)->i_mode);
|
||||
}
|
||||
|
||||
static int io_read(struct io_kiocb *req, unsigned int issue_flags)
|
||||
{
|
||||
struct iovec inline_vecs[UIO_FASTIOV], *iovec = inline_vecs;
|
||||
|
@ -3340,7 +3346,7 @@ static int io_read(struct io_kiocb *req, unsigned int issue_flags)
|
|||
} else if (ret == -EIOCBQUEUED) {
|
||||
goto out_free;
|
||||
} else if (ret <= 0 || ret == io_size || !force_nonblock ||
|
||||
(req->flags & REQ_F_NOWAIT) || !(req->flags & REQ_F_ISREG)) {
|
||||
(req->flags & REQ_F_NOWAIT) || !need_read_all(req)) {
|
||||
/* read all, failed, already did sync or don't want to retry */
|
||||
goto done;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue