Re: [PATCH v7 7/8] fsdax: Introduce dax_iomap_ops for end of reflink

From: Dan Williams
Date: Thu Aug 19 2021 - 23:01:22 EST


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?