Message ID | 20221107175610.349807-2-kbusch@meta.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | io_uring: use ITER_UBUF | expand |
On Mon, Nov 07, 2022 at 09:56:07AM -0800, Keith Busch wrote: > From: Jens Axboe <axboe@kernel.dk> > > Like import_single_range(), but for ITER_UBUF. So what is the argument for not simplify switching import_single_range to always do a ITER_UBUF? Maybe there is a reason against that, but it should be clearly stated here. > > Signed-off-by: Jens Axboe <axboe@kernel.dk> Now that this went through your hands it also needs your signoff.
On Mon, Nov 07, 2022 at 10:55:49PM -0800, Christoph Hellwig wrote: > On Mon, Nov 07, 2022 at 09:56:07AM -0800, Keith Busch wrote: > > From: Jens Axboe <axboe@kernel.dk> > > > > Like import_single_range(), but for ITER_UBUF. > > So what is the argument for not simplify switching > import_single_range to always do a ITER_UBUF? Maybe there is a reason > against that, but it should be clearly stated here. That may be a good idea if everyone uses the more efficient iter, but I thought it'd be safer to keep them separate. There are just a few import_single_range() users that expect the result be ITER_IOVEC. It will take some extra time on my side to make sure that kind of change won't break anything.
diff --git a/include/linux/uio.h b/include/linux/uio.h index 2e3134b14ffd..27575495c006 100644 --- a/include/linux/uio.h +++ b/include/linux/uio.h @@ -337,6 +337,7 @@ ssize_t __import_iovec(int type, const struct iovec __user *uvec, struct iov_iter *i, bool compat); int import_single_range(int type, void __user *buf, size_t len, struct iovec *iov, struct iov_iter *i); +int import_ubuf(int type, void __user *buf, size_t len, struct iov_iter *i); static inline void iov_iter_ubuf(struct iov_iter *i, unsigned int direction, void __user *buf, size_t count) diff --git a/lib/iov_iter.c b/lib/iov_iter.c index c3ca28ca68a6..07adf18e5e40 100644 --- a/lib/iov_iter.c +++ b/lib/iov_iter.c @@ -1855,6 +1855,17 @@ int import_single_range(int rw, void __user *buf, size_t len, } EXPORT_SYMBOL(import_single_range); +int import_ubuf(int rw, void __user *buf, size_t len, struct iov_iter *i) +{ + if (len > MAX_RW_COUNT) + len = MAX_RW_COUNT; + if (unlikely(!access_ok(buf, len))) + return -EFAULT; + + iov_iter_ubuf(i, rw, buf, len); + return 0; +} + /** * iov_iter_restore() - Restore a &struct iov_iter to the same state as when * iov_iter_save_state() was called.