We caller this helper if we don't have a read_iter/write_iter available, and it will go over the iov_iter manually copying data in/out as needed. But it's currently assuming it's being passed an ITER_IOVEC. Enable use of ITER_UBUF with this helper as well, in preparation for importing single segment iovecs as ITER_UBUF. Signed-off-by: Jens Axboe <axboe@xxxxxxxxx> --- fs/read_write.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/fs/read_write.c b/fs/read_write.c index 7a2ff6157eda..de9ce948d11a 100644 --- a/fs/read_write.c +++ b/fs/read_write.c @@ -748,10 +748,21 @@ static ssize_t do_loop_readv_writev(struct file *filp, struct iov_iter *iter, if (flags & ~RWF_HIPRI) return -EOPNOTSUPP; + if (WARN_ON_ONCE(iter->iter_type != ITER_IOVEC && + iter->iter_type != ITER_UBUF)) + return -EINVAL; + while (iov_iter_count(iter)) { - struct iovec iovec = iov_iter_iovec(iter); + struct iovec iovec; ssize_t nr; + if (iter_is_ubuf(iter)) { + iovec.iov_base = iter->ubuf + iter->iov_offset; + iovec.iov_len = iov_iter_count(iter); + } else { + iovec = iov_iter_iovec(iter); + } + if (type == READ) { nr = filp->f_op->read(filp, iovec.iov_base, iovec.iov_len, ppos); -- 2.39.2