io_uring: ensure async buffered read-retry is setup properly
authorJens Axboe <axboe@kernel.dk>
Fri, 25 Sep 2020 21:23:43 +0000 (15:23 -0600)
committerJens Axboe <axboe@kernel.dk>
Fri, 25 Sep 2020 21:39:13 +0000 (15:39 -0600)
A previous commit for fixing up short reads botched the async retry
path, so we ended up going to worker threads more often than we should.
Fix this up, so retries work the way they originally were intended to.

Fixes: 227c0c9673d8 ("io_uring: internally retry short reads")
Reported-by: Hao_Xu <haoxu@linux.alibaba.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c

index ad828fa19af4c718d243dd1bd300e10b3c7f4ad6..11b8e428300db6ecb05a8503006d448750af4881 100644 (file)
@@ -3172,10 +3172,8 @@ static int io_read(struct io_kiocb *req, bool force_nonblock,
                        goto done;
                /* some cases will consume bytes even on error returns */
                iov_iter_revert(iter, iov_count - iov_iter_count(iter));
-               ret = io_setup_async_rw(req, iovec, inline_vecs, iter, false);
-               if (ret)
-                       goto out_free;
-               return -EAGAIN;
+               ret = 0;
+               goto copy_iov;
        } else if (ret < 0) {
                /* make sure -ERESTARTSYS -> -EINTR is done */
                goto done;