[Devel] [PATCH RHEL7 COMMIT] dax: dax_iomap_rw(): switch to iov_iter
Konstantin Khorenko
khorenko at virtuozzo.com
Mon May 25 17:52:31 MSK 2020
The commit is pushed to "branch-rh7-3.10.0-1127.8.2.vz7.161.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-1127.8.2.vz7.161.1
------>
commit 42d93460df3eba89f20d416c5bc2f286c6b808f1
Author: Kirill Tkhai <ktkhai at virtuozzo.com>
Date: Mon May 25 17:52:31 2020 +0300
dax: dax_iomap_rw(): switch to iov_iter
Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
=====================
Patchset description:
[00/30] fs,direct_IO: Switch to iov_iter and allow bio_vec for ext4
This patchset transforms direct_IO callbacks, blockdev_direct_IO
and its underlining functions to iov_iter, and introduces complete
support of iov_iter for ext4.
Supported iov_iter subtypes for ext4 is iovec and bio_vec. The first
is for traditional user-submitted aio, while bio_vec is the type,
which is important for us, since we use it in ploop.
bio_vec operates with pages instead of user addresses (like iovec
does), so it requires specific callbacks in do_blockdev_direct_IO()
and in the functions it calls.
The patchset reworks do_blockdev_direct_IO() in the same manner
as in mainstrean. The most of rest patches are prepared manually,
since we have significant differences to ms (RHEL7 patches, our
direct IO patches for FUSE; all they have changed many functions).
At the end, kaio engine (resulting in direct_IO) became possible
to be enabled for ext4.
https://jira.sw.ru/browse/PSBM-99793
---
fs/dax.c | 13 +++++--------
fs/ext4/file.c | 12 ++++++++++--
fs/xfs/xfs_file.c | 10 ++++++++--
include/linux/dax.h | 4 ++--
4 files changed, 25 insertions(+), 14 deletions(-)
diff --git a/fs/dax.c b/fs/dax.c
index 57d5b0a86a305..f22e3b32b6cc6 100644
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -1357,25 +1357,22 @@ dax_iomap_actor_write(struct inode *inode, loff_t pos, loff_t length, void *data
* and evicting any page cache pages in the region under I/O.
*/
ssize_t
-dax_iomap_rw(int rw, struct kiocb *iocb, const struct iovec *iov,
- unsigned long nr_segs, loff_t pos,
+dax_iomap_rw(int rw, struct kiocb *iocb, struct iov_iter *iter,
+ loff_t pos,
size_t count, const struct iomap_ops *ops)
{
struct address_space *mapping = iocb->ki_filp->f_mapping;
struct inode *inode = mapping->host;
loff_t ret = 0, done = 0;
unsigned flags = 0;
- struct iov_iter iter;
-
- iov_iter_init(&iter, iov, nr_segs, count, 0);
if (rw & WRITE)
flags |= IOMAP_WRITE;
- while (iov_iter_count(&iter)) {
- ret = iomap_apply(inode, pos, iov_iter_count(&iter), flags, ops,
- &iter,
+ while (iov_iter_count(iter)) {
+ ret = iomap_apply(inode, pos, iov_iter_count(iter), flags, ops,
+ iter,
(rw & WRITE) ?
dax_iomap_actor_write : dax_iomap_actor_read);
if (ret <= 0)
diff --git a/fs/ext4/file.c b/fs/ext4/file.c
index 3adbb7b72c5ae..2808aadd40336 100644
--- a/fs/ext4/file.c
+++ b/fs/ext4/file.c
@@ -220,6 +220,7 @@ ext4_file_dax_write(
struct inode *inode = file_inode(iocb->ki_filp);
ssize_t ret;
size_t size = iov_length(iovp, nr_segs);
+ struct iov_iter iter;
inode_lock(inode);
ret = ext4_write_checks(iocb, iovp, nr_segs, &pos);
@@ -232,7 +233,9 @@ ext4_file_dax_write(
if (ret)
goto out;
- ret = dax_iomap_rw(WRITE, iocb, iovp, nr_segs, pos,
+ iov_iter_init(&iter, iovp, nr_segs, size, 0);
+
+ ret = dax_iomap_rw(WRITE, iocb, &iter, pos,
size, &ext4_iomap_ops);
out:
inode_unlock(inode);
@@ -516,6 +519,8 @@ ext4_file_dax_read(
size_t size = iov_length(iovp, nr_segs);
ssize_t ret = 0;
struct inode *inode = file_inode(iocb->ki_filp);
+ struct iov_iter iter;
+
if (!size)
return 0; /* skip atime */
@@ -529,7 +534,10 @@ ext4_file_dax_read(
/* Fallback to buffered IO in case we cannot support DAX */
return generic_file_aio_read(iocb, iovp, nr_segs, pos);
}
- ret = dax_iomap_rw(READ, iocb, iovp, nr_segs, pos,
+
+ iov_iter_init(&iter, iovp, nr_segs, size, 0);
+
+ ret = dax_iomap_rw(READ, iocb, &iter, pos,
size, &ext4_iomap_ops);
inode_unlock(inode);
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index 67a632f2c00f1..378e8e8264744 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -318,6 +318,7 @@ xfs_file_dax_read(
struct xfs_inode *ip = XFS_I(iocb->ki_filp->f_mapping->host);
size_t size = 0;
ssize_t ret = 0;
+ struct iov_iter iter;
size = iov_length(iovp, nr_segs);
@@ -326,8 +327,10 @@ xfs_file_dax_read(
if (!size)
return 0; /* skip atime */
+ iov_iter_init(&iter, iovp, nr_segs, size, 0);
+
xfs_rw_ilock(ip, XFS_IOLOCK_SHARED);
- ret = dax_iomap_rw(READ, iocb, iovp, nr_segs, pos,
+ ret = dax_iomap_rw(READ, iocb, &iter, pos,
size, &xfs_iomap_ops);
xfs_rw_iunlock(ip, XFS_IOLOCK_SHARED);
@@ -776,6 +779,7 @@ xfs_file_dax_write(
size_t count = ocount;
int iolock = XFS_IOLOCK_EXCL;
ssize_t ret, error = 0;
+ struct iov_iter iter;
xfs_rw_ilock(ip, iolock);
ret = xfs_file_aio_write_checks(file, &pos, &count, &iolock);
@@ -787,7 +791,9 @@ xfs_file_dax_write(
trace_xfs_file_dax_write(ip, count, pos);
- ret = dax_iomap_rw(WRITE, iocb, iovp, nr_segs, pos,
+ iov_iter_init(&iter, iovp, nr_segs, count, 0);
+
+ ret = dax_iomap_rw(WRITE, iocb, &iter, pos,
count, &xfs_iomap_ops);
if (ret > 0 && iocb->ki_pos > i_size_read(inode)) {
i_size_write(inode, iocb->ki_pos);
diff --git a/include/linux/dax.h b/include/linux/dax.h
index 0195fd3db7c9f..7e3a23236ec48 100644
--- a/include/linux/dax.h
+++ b/include/linux/dax.h
@@ -144,8 +144,8 @@ int dax_memcpy_toiovecend(struct dax_device *dax_dev, pgoff_t pgoff,
const struct iovec *iov, void *addr, int offset, int len);
void dax_flush(struct dax_device *dax_dev, void *addr, size_t size);
-ssize_t dax_iomap_rw(int rw, struct kiocb *iocb, const struct iovec *iov,
- unsigned long nr_segs, loff_t pos,
+ssize_t dax_iomap_rw(int rw, struct kiocb *iocb, struct iov_iter *iter,
+ loff_t pos,
size_t count, const struct iomap_ops *ops);
int dax_iomap_fault(struct vm_fault *vmf, enum page_entry_size pe_size,
pfn_t *pfnp, int *errp, const struct iomap_ops *ops);
More information about the Devel
mailing list