fsdax: switch dax_iomap_rw to use iomap_iter
authorChristoph Hellwig <hch@lst.de>
Wed, 11 Aug 2021 01:33:13 +0000 (18:33 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 17 Aug 2021 04:26:33 +0000 (21:26 -0700)
Switch the dax_iomap_rw implementation to use iomap_iter.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
fs/dax.c

index 4d63040..51da453 100644 (file)
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -1103,20 +1103,21 @@ s64 dax_iomap_zero(loff_t pos, u64 length, struct iomap *iomap)
        return size;
 }
 
-static loff_t
-dax_iomap_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
-               struct iomap *iomap, struct iomap *srcmap)
+static loff_t dax_iomap_iter(const struct iomap_iter *iomi,
+               struct iov_iter *iter)
 {
+       const struct iomap *iomap = &iomi->iomap;
+       loff_t length = iomap_length(iomi);
+       loff_t pos = iomi->pos;
        struct block_device *bdev = iomap->bdev;
        struct dax_device *dax_dev = iomap->dax_dev;
-       struct iov_iter *iter = data;
        loff_t end = pos + length, done = 0;
        ssize_t ret = 0;
        size_t xfer;
        int id;
 
        if (iov_iter_rw(iter) == READ) {
-               end = min(end, i_size_read(inode));
+               end = min(end, i_size_read(iomi->inode));
                if (pos >= end)
                        return 0;
 
@@ -1133,7 +1134,7 @@ dax_iomap_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
         * written by write(2) is visible in mmap.
         */
        if (iomap->flags & IOMAP_F_NEW) {
-               invalidate_inode_pages2_range(inode->i_mapping,
+               invalidate_inode_pages2_range(iomi->inode->i_mapping,
                                              pos >> PAGE_SHIFT,
                                              (end - 1) >> PAGE_SHIFT);
        }
@@ -1209,31 +1210,29 @@ ssize_t
 dax_iomap_rw(struct kiocb *iocb, struct iov_iter *iter,
                const struct iomap_ops *ops)
 {
-       struct address_space *mapping = iocb->ki_filp->f_mapping;
-       struct inode *inode = mapping->host;
-       loff_t pos = iocb->ki_pos, ret = 0, done = 0;
-       unsigned flags = 0;
+       struct iomap_iter iomi = {
+               .inode          = iocb->ki_filp->f_mapping->host,
+               .pos            = iocb->ki_pos,
+               .len            = iov_iter_count(iter),
+       };
+       loff_t done = 0;
+       int ret;
 
        if (iov_iter_rw(iter) == WRITE) {
-               lockdep_assert_held_write(&inode->i_rwsem);
-               flags |= IOMAP_WRITE;
+               lockdep_assert_held_write(&iomi.inode->i_rwsem);
+               iomi.flags |= IOMAP_WRITE;
        } else {
-               lockdep_assert_held(&inode->i_rwsem);
+               lockdep_assert_held(&iomi.inode->i_rwsem);
        }
 
        if (iocb->ki_flags & IOCB_NOWAIT)
-               flags |= IOMAP_NOWAIT;
+               iomi.flags |= IOMAP_NOWAIT;
 
-       while (iov_iter_count(iter)) {
-               ret = iomap_apply(inode, pos, iov_iter_count(iter), flags, ops,
-                               iter, dax_iomap_actor);
-               if (ret <= 0)
-                       break;
-               pos += ret;
-               done += ret;
-       }
+       while ((ret = iomap_iter(&iomi, ops)) > 0)
+               iomi.processed = dax_iomap_iter(&iomi, iter);
 
-       iocb->ki_pos += done;
+       done = iomi.pos - iocb->ki_pos;
+       iocb->ki_pos = iomi.pos;
        return done ? done : ret;
 }
 EXPORT_SYMBOL_GPL(dax_iomap_rw);
@@ -1307,7 +1306,7 @@ static vm_fault_t dax_iomap_pte_fault(struct vm_fault *vmf, pfn_t *pfnp,
        }
 
        /*
-        * Note that we don't bother to use iomap_apply here: DAX required
+        * Note that we don't bother to use iomap_iter here: DAX required
         * the file system block size to be equal the page size, which means
         * that we never have to deal with more than a single extent here.
         */
@@ -1561,7 +1560,7 @@ static vm_fault_t dax_iomap_pmd_fault(struct vm_fault *vmf, pfn_t *pfnp,
        }
 
        /*
-        * Note that we don't use iomap_apply here.  We aren't doing I/O, only
+        * Note that we don't use iomap_iter here.  We aren't doing I/O, only
         * setting up a mapping, so really we're using iomap_begin() as a way
         * to look up our filesystem block.
         */