FAILED: patch "[PATCH] io_uring: retain sockaddr_storage across send/recvmsg async" failed to apply to 5.4-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From b537916ca5107c3a8714b8ab3099c0ec205aec12 Mon Sep 17 00:00:00 2001
From: Jens Axboe <[email protected]>
Date: Sun, 9 Feb 2020 11:29:15 -0700
Subject: [PATCH] io_uring: retain sockaddr_storage across send/recvmsg async
punt
Jonas reports that he sometimes sees -97/-22 error returns from sendmsg, if it gets punted async. This is due to not retaining the sockaddr_storage between calls. Include that in the state we copy when going async.
Cc [email protected] # 5.3+
Reported-by Jonas Bonn <[email protected]>
Tested-by Jonas Bonn <[email protected]>
Signed-off-by Jens Axboe <[email protected]>
fs/io_uring.c +5 -6
@@ -442,6 +442,7 @@ struct io_async_msghdr {struct iovec *iov;struct sockaddr __user *uaddr;struct msghdr msg; +struct sockaddr_storage addr; };struct io_async_rw {
@@ -3032,12 +3033,11 @@ static int io_sendmsg(struct io_kiocb *req, struct io_kiocb **nxt, sock =sock_from_file (req->file, &ret);if (sock) {struct io_async_ctx io; -struct sockaddr_storage addr;unsigned flags;if (req->io) { kmsg = &req->io->msg; - kmsg->msg.msg_name = &addr; + kmsg->msg.msg_name = &req->io->msg.addr;/* if iov is set, it's allocated already */ if (!kmsg->iov) kmsg->iov = kmsg->fast_iov;
@@ -3046,7 +3046,7 @@ static int io_sendmsg(struct io_kiocb *req, struct io_kiocb **nxt,struct io_sr_msg *sr = &req->sr_msg; kmsg = &io.msg; - kmsg->msg.msg_name = &addr; + kmsg->msg.msg_name = &io.msg.addr; io.msg.iov = io.msg.fast_iov; ret = sendmsg_copy_msghdr(&io.msg.msg, sr->msg,
@@ -3185,12 +3185,11 @@ static int io_recvmsg(struct io_kiocb *req, struct io_kiocb **nxt, sock =sock_from_file (req->file, &ret);if (sock) {struct io_async_ctx io; -struct sockaddr_storage addr;unsigned flags;if (req->io) { kmsg = &req->io->msg; - kmsg->msg.msg_name = &addr; + kmsg->msg.msg_name = &req->io->msg.addr;/* if iov is set, it's allocated already */ if (!kmsg->iov) kmsg->iov = kmsg->fast_iov;
@@ -3199,7 +3198,7 @@ static int io_recvmsg(struct io_kiocb *req, struct io_kiocb **nxt,struct io_sr_msg *sr = &req->sr_msg; kmsg = &io.msg; - kmsg->msg.msg_name = &addr; + kmsg->msg.msg_name = &io.msg.addr; io.msg.iov = io.msg.fast_iov; ret = recvmsg_copy_msghdr(&io.msg.msg, sr->msg,