]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
io_uring/net: combine msghdr copy
authorPavel Begunkov <asml.silence@gmail.com>
Fri, 7 Mar 2025 16:00:33 +0000 (16:00 +0000)
committerJens Axboe <axboe@kernel.dk>
Fri, 7 Mar 2025 20:40:39 +0000 (13:40 -0700)
Call the compat version from inside of io_msg_copy_hdr() and don't
duplicate it in callers.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/25795660f7b31f9273911c99f495d9c2b169ecda.1741362889.git.asml.silence@gmail.com
[axboe: fixup msg pointer vs variable braino in io_msg_copy_hdr()]
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/net.c

index 905d1ee01201acd6f82b399ee6240307ba15483a..f64400aebd54234559c6f95891fec23dc3e718ef 100644 (file)
@@ -287,6 +287,24 @@ static int io_msg_copy_hdr(struct io_kiocb *req, struct io_async_msghdr *iomsg,
        struct user_msghdr __user *umsg = sr->umsg;
        int ret;
 
+       iomsg->msg.msg_name = &iomsg->addr;
+       iomsg->msg.msg_iter.nr_segs = 0;
+
+       if (io_is_compat(req->ctx)) {
+               struct compat_msghdr cmsg;
+
+               ret = io_compat_msg_copy_hdr(req, iomsg, &cmsg, ddir, save_addr);
+               if (ret)
+                       return ret;
+
+               memset(msg, 0, sizeof(*msg));
+               msg->msg_namelen = cmsg.msg_namelen;
+               msg->msg_controllen = cmsg.msg_controllen;
+               msg->msg_iov = compat_ptr(cmsg.msg_iov);
+               msg->msg_iovlen = cmsg.msg_iovlen;
+               return 0;
+       }
+
        ret = io_copy_msghdr_from_user(msg, umsg);
        if (unlikely(ret))
                return ret;
@@ -323,18 +341,6 @@ static int io_sendmsg_copy_hdr(struct io_kiocb *req,
        struct user_msghdr msg;
        int ret;
 
-       iomsg->msg.msg_name = &iomsg->addr;
-       iomsg->msg.msg_iter.nr_segs = 0;
-
-       if (io_is_compat(req->ctx)) {
-               struct compat_msghdr cmsg;
-
-               ret = io_compat_msg_copy_hdr(req, iomsg, &cmsg, ITER_SOURCE,
-                                            NULL);
-               sr->msg_control = iomsg->msg.msg_control_user;
-               return ret;
-       }
-
        ret = io_msg_copy_hdr(req, iomsg, &msg, ITER_SOURCE, NULL);
        /* save msg_control as sys_sendmsg() overwrites it */
        sr->msg_control = iomsg->msg.msg_control_user;
@@ -710,21 +716,7 @@ static int io_recvmsg_copy_hdr(struct io_kiocb *req,
        struct user_msghdr msg;
        int ret;
 
-       iomsg->msg.msg_name = &iomsg->addr;
-       iomsg->msg.msg_iter.nr_segs = 0;
-
-       if (io_is_compat(req->ctx)) {
-               struct compat_msghdr cmsg;
-
-               ret = io_compat_msg_copy_hdr(req, iomsg, &cmsg, ITER_DEST,
-                                            &iomsg->uaddr);
-               memset(&msg, 0, sizeof(msg));
-               msg.msg_namelen = cmsg.msg_namelen;
-               msg.msg_controllen = cmsg.msg_controllen;
-       } else {
-               ret = io_msg_copy_hdr(req, iomsg, &msg, ITER_DEST, &iomsg->uaddr);
-       }
-
+       ret = io_msg_copy_hdr(req, iomsg, &msg, ITER_DEST, &iomsg->uaddr);
        if (unlikely(ret))
                return ret;
        return io_recvmsg_mshot_prep(req, iomsg, msg.msg_namelen,