io_uring/rw: Drop custom iov copy in io_iov_buffer_select_prep

Similar to commit f4eaf8eda8 ("io_uring/rsrc: Drop io_copy_iov in
favor of iovec API"), avoid custom copy and just rely on the iovec api.

Signed-off-by: Gabriel Krisman Bertazi <krisman@suse.de>
Link: https://patch.msgid.link/20260813004022.3514537-2-krisman@suse.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Gabriel Krisman Bertazi
2026-08-12 20:40:20 -04:00
committed by Jens Axboe
parent cd305ee363
commit 0ca8920585

View File

@@ -9,7 +9,6 @@
#include <linux/fsnotify.h>
#include <linux/poll.h>
#include <linux/nospec.h>
#include <linux/compat.h>
#include <linux/io_uring/cmd.h>
#include <linux/indirect_call_wrapper.h>
@@ -50,33 +49,20 @@ static bool io_file_supports_nowait(struct io_kiocb *req, __poll_t mask)
return false;
}
static int io_iov_compat_buffer_select_prep(struct io_rw *rw)
{
struct compat_iovec __user *uiov = u64_to_user_ptr(rw->addr);
struct compat_iovec iov;
if (copy_from_user(&iov, uiov, sizeof(iov)))
return -EFAULT;
rw->len = iov.iov_len;
return 0;
}
static int io_iov_buffer_select_prep(struct io_kiocb *req)
{
struct iovec __user *uiov;
struct iovec iov;
struct iovec fast_iov, *iov;
struct io_rw *rw = io_kiocb_to_cmd(req, struct io_rw);
if (rw->len != 1)
return -EINVAL;
if (io_is_compat(req->ctx))
return io_iov_compat_buffer_select_prep(rw);
uiov = u64_to_user_ptr(rw->addr);
if (copy_from_user(&iov, uiov, sizeof(*uiov)))
return -EFAULT;
rw->len = iov.iov_len;
iov = iovec_from_user(uiov, 1, 1, &fast_iov, io_is_compat(req->ctx));
if (IS_ERR(iov))
return PTR_ERR(iov);
rw->len = iov->iov_len;
return 0;
}