On Mon, Aug 09, 2021 at 08:12:37AM +0200, Christoph Hellwig wrote: > Switch the dax_iomap_rw implementation to use iomap_iter. > > Signed-off-by: Christoph Hellwig <hch@xxxxxx> /me gets excited about this file getting cleaned up Reviewed-by: Darrick J. Wong <djwong@xxxxxxxxxx> --D > --- > fs/dax.c | 49 ++++++++++++++++++++++++------------------------- > 1 file changed, 24 insertions(+), 25 deletions(-) > > diff --git a/fs/dax.c b/fs/dax.c > index 4d63040fd71f56..51da45301350a6 100644 > --- 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. > */ > -- > 2.30.2 >