On Sun, Aug 15, 2021 at 11:05 PM Shiyang Ruan <ruansy.fnst@xxxxxxxxxxx> wrote: > > After writing data, reflink requires end operations to remap those new > allocated extents. The current ->iomap_end() ignores the error code > returned from ->actor(), so we introduce this dax_iomap_ops and change > the dax_iomap_*() interfaces to do this job. > > - the dax_iomap_ops contains the original struct iomap_ops and fsdax > specific ->actor_end(), which is for the end operations of reflink > - also introduce dax specific zero_range, truncate_page > - create new dax_iomap_ops for ext2 and ext4 > > Signed-off-by: Shiyang Ruan <ruansy.fnst@xxxxxxxxxxx> > --- > fs/dax.c | 68 +++++++++++++++++++++++++++++++++++++----- > fs/ext2/ext2.h | 3 ++ > fs/ext2/file.c | 6 ++-- > fs/ext2/inode.c | 11 +++++-- > fs/ext4/ext4.h | 3 ++ > fs/ext4/file.c | 6 ++-- > fs/ext4/inode.c | 13 ++++++-- > fs/iomap/buffered-io.c | 3 +- > fs/xfs/xfs_bmap_util.c | 3 +- > fs/xfs/xfs_file.c | 8 ++--- > fs/xfs/xfs_iomap.c | 36 +++++++++++++++++++++- > fs/xfs/xfs_iomap.h | 33 ++++++++++++++++++++ > fs/xfs/xfs_iops.c | 7 ++--- > fs/xfs/xfs_reflink.c | 3 +- > include/linux/dax.h | 21 ++++++++++--- > include/linux/iomap.h | 1 + > 16 files changed, 189 insertions(+), 36 deletions(-) > > diff --git a/fs/dax.c b/fs/dax.c > index 74dd918cff1f..0e0536765a7e 100644 > --- a/fs/dax.c > +++ b/fs/dax.c > @@ -1348,11 +1348,30 @@ static loff_t dax_iomap_iter(const struct iomap_iter *iomi, > return done ? done : ret; > } > > +static inline int > +__dax_iomap_iter(struct iomap_iter *iter, const struct dax_iomap_ops *ops) > +{ > + int ret; > + > + /* > + * Call dax_iomap_ops->actor_end() before iomap_ops->iomap_end() in > + * each iteration. > + */ > + if (iter->iomap.length && ops->actor_end) { > + ret = ops->actor_end(iter->inode, iter->pos, iter->len, > + iter->processed); > + if (ret < 0) > + return ret; > + } > + > + return iomap_iter(iter, &ops->iomap_ops); This reorganization looks needlessly noisy. Why not require the iomap_end operation to perform the actor_end work. I.e. why can't xfs_dax_write_iomap_actor_end() just be the passed in iomap_end? I am not seeing where the ->iomap_end() result is ignored?