mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-06 05:06:29 +00:00
io_uring: cleanup io_import_iovec() of pre-mapped request
io_rw_prep_async() goes through a dance of clearing req->io, calling the iovec import, then re-setting req->io. Provide an internal helper that does the right thing without needing state tweaked to get there. This enables further cleanups in io_read, io_write, and io_resubmit_prep(), but that's left for another time. Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
3b2a4439e0
commit
8452fd0ce6
@ -2819,22 +2819,15 @@ static ssize_t io_iov_buffer_select(struct io_kiocb *req, struct iovec *iov,
|
||||
return __io_iov_buffer_select(req, iov, needs_lock);
|
||||
}
|
||||
|
||||
static ssize_t io_import_iovec(int rw, struct io_kiocb *req,
|
||||
struct iovec **iovec, struct iov_iter *iter,
|
||||
bool needs_lock)
|
||||
static ssize_t __io_import_iovec(int rw, struct io_kiocb *req,
|
||||
struct iovec **iovec, struct iov_iter *iter,
|
||||
bool needs_lock)
|
||||
{
|
||||
void __user *buf = u64_to_user_ptr(req->rw.addr);
|
||||
size_t sqe_len = req->rw.len;
|
||||
ssize_t ret;
|
||||
u8 opcode;
|
||||
|
||||
if (req->io) {
|
||||
struct io_async_rw *iorw = &req->io->rw;
|
||||
|
||||
*iovec = NULL;
|
||||
return iov_iter_count(&iorw->iter);
|
||||
}
|
||||
|
||||
opcode = req->opcode;
|
||||
if (opcode == IORING_OP_READ_FIXED || opcode == IORING_OP_WRITE_FIXED) {
|
||||
*iovec = NULL;
|
||||
@ -2879,6 +2872,16 @@ static ssize_t io_import_iovec(int rw, struct io_kiocb *req,
|
||||
return import_iovec(rw, buf, sqe_len, UIO_FASTIOV, iovec, iter);
|
||||
}
|
||||
|
||||
static ssize_t io_import_iovec(int rw, struct io_kiocb *req,
|
||||
struct iovec **iovec, struct iov_iter *iter,
|
||||
bool needs_lock)
|
||||
{
|
||||
if (!req->io)
|
||||
return __io_import_iovec(rw, req, iovec, iter, needs_lock);
|
||||
*iovec = NULL;
|
||||
return iov_iter_count(&req->io->rw.iter);
|
||||
}
|
||||
|
||||
/*
|
||||
* For files that don't have ->read_iter() and ->write_iter(), handle them
|
||||
* by looping over ->read() or ->write() manually.
|
||||
@ -3001,11 +3004,8 @@ static inline int io_rw_prep_async(struct io_kiocb *req, int rw,
|
||||
ssize_t ret;
|
||||
|
||||
iorw->iter.iov = iorw->fast_iov;
|
||||
/* reset ->io around the iovec import, we don't want to use it */
|
||||
req->io = NULL;
|
||||
ret = io_import_iovec(rw, req, (struct iovec **) &iorw->iter.iov,
|
||||
ret = __io_import_iovec(rw, req, (struct iovec **) &iorw->iter.iov,
|
||||
&iorw->iter, !force_nonblock);
|
||||
req->io = container_of(iorw, struct io_async_ctx, rw);
|
||||
if (unlikely(ret < 0))
|
||||
return ret;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user