One case was missed in the short IO retry handling, and that's hitting
-EAGAIN on a blocking attempt read (eg from io-wq context). This is a
problem on sockets that are marked as non-blocking when created, they
don't carry any REQ_F_NOWAIT information to help us terminate them
instead of perpetually retrying.
Fixes: bae9fda2441a ("io_uring: internally retry short reads")
Signed-off-by: Jens Axboe <axboe@kernel.dk>
ret = 0;
goto out_free;
} else if (ret == -EAGAIN) {
+ if (!force_nonblock)
+ goto done;
ret = io_setup_async_rw(req, iovec, inline_vecs, iter, false);
if (ret)
goto out_free;
}
/* read it all, or we did blocking attempt. no retry. */
- if (!iov_iter_count(iter) || !force_nonblock)
+ if (!iov_iter_count(iter) || !force_nonblock ||
+ (req->file->f_flags & O_NONBLOCK))
goto done;
io_size -= ret;