Message ID | 8717a010-125e-4f4f-a1e9-8d6ee7b31491@kernel.dk (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | io_uring/net: mark socket connected on -EINPROGRESS retry | expand |
diff --git a/io_uring/net.c b/io_uring/net.c index 7a8e298af81b..b45ac315ef90 100644 --- a/io_uring/net.c +++ b/io_uring/net.c @@ -1466,8 +1466,15 @@ int io_connect(struct io_kiocb *req, unsigned int issue_flags) ret = -ENOTSOCK; socket = sock_from_file(req->file); - if (socket) + if (socket) { ret = sock_error(socket->sk); + if (!ret) { + /* no error, mark us connected */ + lock_sock(socket->sk); + socket->state = SS_CONNECTED; + release_sock(socket->sk); + } + } goto out; }
With the removal of the retry on -EINPROGRESS, we're not getting the socket marked connected before another connect attempt is made. This can result in getting a successful connect completion where we're now connected, yet it's not marked as such on the net side. A followup connect request would then return '0' rather than -EISCONN, which then gets the connectioned marked connected. A second followup would then correctly return -EISCONN. If we don't get a socket error on our -EINPROGRESS retry condition, mark the socket as successfully connected. Cc: stable@vger.kernel.org Fixes: 3fb1bd688172 ("io_uring/net: handle -EINPROGRESS correct for IORING_OP_CONNECT") Link: https://github.com/axboe/liburing/issues/980 Signed-off-by: Jens Axboe <axboe@kernel.dk> ---