History

io_uring: short circuit -EAGAIN for blocking read attempt

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.

Jens Axboe committed 6 years ago

Commit f91daf51 parent d4e7cd31 file · +4 −1Browse files

Unified · Split

fs/io_uring.c+4−1
@@ -3186,6 +3186,8 @@ static int io_read(struct io_kiocb *req, bool force_nonblock, · 3185 unmodified lines
31863186 ret = 0;
31873187 goto out_free;
31883188 } else if (ret == -EAGAIN) {
3189+ if (!force_nonblock)
3190+ goto done;
31893191 ret = io_setup_async_rw(req, iovec, inline_vecs, iter, false);
31903192 if (ret)
31913193 goto out_free;
@@ -3195,7 +3197,8 @@ static int io_read(struct io_kiocb *req, bool force_nonblock, · 3 unmodified lines
31953197 }
31963198
31973199 /* read it all, or we did blocking attempt. no retry. */
3198− if (!iov_iter_count(iter) || !force_nonblock)
3200+ if (!iov_iter_count(iter) || !force_nonblock ||
3201+ (req->file->f_flags & O_NONBLOCK))
31993202 goto done;
32003203
32013204 io_size -= ret;