[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20200908152250.202142288@linuxfoundation.org>
Date: Tue, 8 Sep 2020 17:25:18 +0200
From: Greg Kroah-Hartman <gregkh@...uxfoundation.org>
To: linux-kernel@...r.kernel.org
Cc: Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
stable@...r.kernel.org,
Norman Maurer <norman.maurer@...glemail.com>,
Jens Axboe <axboe@...nel.dk>
Subject: [PATCH 5.8 176/186] io_uring: no read/write-retry on -EAGAIN error and O_NONBLOCK marked file
From: Jens Axboe <axboe@...nel.dk>
commit 355afaeb578abac907217c256a844cfafb0337b2 upstream.
Actually two things that need fixing up here:
- The io_rw_reissue() -EAGAIN retry is explicit to block devices and
regular files, so don't ever attempt to do that on other types of
files.
- If we hit -EAGAIN on a nonblock marked file, don't arm poll handler for
it. It should just complete with -EAGAIN.
Cc: stable@...r.kernel.org
Reported-by: Norman Maurer <norman.maurer@...glemail.com>
Signed-off-by: Jens Axboe <axboe@...nel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@...uxfoundation.org>
---
fs/io_uring.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -2697,8 +2697,15 @@ static int io_read(struct io_kiocb *req,
else
ret2 = -EINVAL;
+ /* no retry on NONBLOCK marked file */
+ if (ret2 == -EAGAIN && (req->file->f_flags & O_NONBLOCK)) {
+ ret = 0;
+ goto done;
+ }
+
/* Catch -EAGAIN return for forced non-blocking submission */
if (!force_nonblock || ret2 != -EAGAIN) {
+ done:
kiocb_done(kiocb, ret2);
} else {
copy_iov:
@@ -2823,7 +2830,13 @@ static int io_write(struct io_kiocb *req
*/
if (ret2 == -EOPNOTSUPP && (kiocb->ki_flags & IOCB_NOWAIT))
ret2 = -EAGAIN;
+ /* no retry on NONBLOCK marked file */
+ if (ret2 == -EAGAIN && (req->file->f_flags & O_NONBLOCK)) {
+ ret = 0;
+ goto done;
+ }
if (!force_nonblock || ret2 != -EAGAIN) {
+done:
kiocb_done(kiocb, ret2);
} else {
copy_iov:
Powered by blists - more mailing lists