io_uring: fix up O_NONBLOCK handling for sockets
authorJens Axboe <axboe@kernel.dk>
Thu, 17 Oct 2019 15:20:46 +0000 (09:20 -0600)
committerJens Axboe <axboe@kernel.dk>
Thu, 17 Oct 2019 21:49:11 +0000 (15:49 -0600)
commit491381ce07ca57f68c49c79a8a43da5b60749e32
treefc3ae1c4ef80323a180bd24fd5f68193ca267bc8
parent6333ff6e5a43703a8f7ea16b0f2890a38f5467f0
io_uring: fix up O_NONBLOCK handling for sockets

We've got two issues with the non-regular file handling for non-blocking
IO:

1) We don't want to re-do a short read in full for a non-regular file,
   as we can't just read the data again.
2) For non-regular files that don't support non-blocking IO attempts,
   we need to punt to async context even if the file is opened as
   non-blocking. Otherwise the caller always gets -EAGAIN.

Add two new request flags to handle these cases. One is just a cache
of the inode S_ISREG() status, the other tells io_uring that we always
need to punt this request to async context, even if REQ_F_NOWAIT is set.

Cc: stable@vger.kernel.org
Reported-by: Hrvoje Zeba <zeba.hrvoje@gmail.com>
Tested-by: Hrvoje Zeba <zeba.hrvoje@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c