summaryrefslogtreecommitdiffstats
path: root/fs/io_uring.c
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2020-06-04 19:27:01 +0200
committerJens Axboe <axboe@kernel.dk>2020-06-04 19:45:29 +0200
commitdddb3e26f6d88c5344d28cb5ff9d3d6fa05c4f7a (patch)
tree8f60fd47f8931bbce5dcf68dab026389c8d7b0bb /fs/io_uring.c
parentio_uring: move send/recv IOPOLL check into prep (diff)
downloadlinux-dddb3e26f6d88c5344d28cb5ff9d3d6fa05c4f7a.tar.xz
linux-dddb3e26f6d88c5344d28cb5ff9d3d6fa05c4f7a.zip
io_uring: re-set iov base/len for buffer select retry
We already have the buffer selected, but we should set the iter list again. Cc: stable@vger.kernel.org # v5.7 Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'fs/io_uring.c')
-rw-r--r--fs/io_uring.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/fs/io_uring.c b/fs/io_uring.c
index d2bd82387a4c..70f0f2f940fb 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -2363,8 +2363,14 @@ static ssize_t __io_iov_buffer_select(struct io_kiocb *req, struct iovec *iov,
static ssize_t io_iov_buffer_select(struct io_kiocb *req, struct iovec *iov,
bool needs_lock)
{
- if (req->flags & REQ_F_BUFFER_SELECTED)
+ if (req->flags & REQ_F_BUFFER_SELECTED) {
+ struct io_buffer *kbuf;
+
+ kbuf = (struct io_buffer *) (unsigned long) req->rw.addr;
+ iov[0].iov_base = u64_to_user_ptr(kbuf->addr);
+ iov[0].iov_len = kbuf->len;
return 0;
+ }
if (!req->rw.len)
return 0;
else if (req->rw.len > 1)