io_uring: deferred send/recvmsg should assign iov
authorJens Axboe <axboe@kernel.dk>
Tue, 10 Dec 2019 02:35:20 +0000 (19:35 -0700)
committerJens Axboe <axboe@kernel.dk>
Tue, 10 Dec 2019 23:33:23 +0000 (16:33 -0700)
Don't just assign it from the main call path, that can miss the case
when we're called from issue deferral.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c

index 366fc35..b84def5 100644 (file)
@@ -2026,6 +2026,7 @@ static int io_sendmsg_prep(struct io_kiocb *req, struct io_async_ctx *io)
 
        flags = READ_ONCE(sqe->msg_flags);
        msg = (struct user_msghdr __user *)(unsigned long) READ_ONCE(sqe->addr);
+       io->msg.iov = io->msg.fast_iov;
        return sendmsg_copy_msghdr(&io->msg.msg, msg, flags, &io->msg.iov);
 #else
        return 0;
@@ -2061,7 +2062,6 @@ static int io_sendmsg(struct io_kiocb *req, const struct io_uring_sqe *sqe,
                } else {
                        kmsg = &io.msg.msg;
                        kmsg->msg_name = &addr;
-                       io.msg.iov = io.msg.fast_iov;
                        ret = io_sendmsg_prep(req, &io);
                        if (ret)
                                goto out;
@@ -2104,6 +2104,7 @@ static int io_recvmsg_prep(struct io_kiocb *req, struct io_async_ctx *io)
 
        flags = READ_ONCE(sqe->msg_flags);
        msg = (struct user_msghdr __user *)(unsigned long) READ_ONCE(sqe->addr);
+       io->msg.iov = io->msg.fast_iov;
        return recvmsg_copy_msghdr(&io->msg.msg, msg, flags, &io->msg.uaddr,
                                        &io->msg.iov);
 #else
@@ -2143,7 +2144,6 @@ static int io_recvmsg(struct io_kiocb *req, const struct io_uring_sqe *sqe,
                } else {
                        kmsg = &io.msg.msg;
                        kmsg->msg_name = &addr;
-                       io.msg.iov = io.msg.fast_iov;
                        ret = io_recvmsg_prep(req, &io);
                        if (ret)
                                goto out;