Patch "io_uring: retry in case of short read on block device" has been added to the 5.14-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    io_uring: retry in case of short read on block device

to the 5.14-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     io_uring-retry-in-case-of-short-read-on-block-device.patch
and it can be found in the queue-5.14 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 4e3adb15deeb9ab52c8de90960957ea74dde01f4
Author: Ming Lei <ming.lei@xxxxxxxxxx>
Date:   Sat Aug 21 23:07:51 2021 +0800

    io_uring: retry in case of short read on block device
    
    [ Upstream commit 7db304375e11741e5940f9bc549155035bfb4dc1 ]
    
    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: 9a173346bd9e ("io_uring: fix short read retries for non-reg files")
    Cc: Pavel Begunkov <asml.silence@xxxxxxxxx>
    Signed-off-by: Ming Lei <ming.lei@xxxxxxxxxx>
    Reviewed-by: Pavel Begunkov <asml.silence@xxxxxxxxx>
    Link: https://lore.kernel.org/r/20210821150751.1290434-1-ming.lei@xxxxxxxxxx
    Signed-off-by: Jens Axboe <axboe@xxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/io_uring.c b/fs/io_uring.c
index 0361c48c9cb0..43aaa3566431 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -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;
 	}



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux