[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAPcyv4jbi=p=SjFYZcHnEAu+KY821pW_k_yA5u6hya4jEfrTUg@mail.gmail.com>
Date: Thu, 19 Aug 2021 20:01:08 -0700
From: Dan Williams <dan.j.williams@...el.com>
To: Shiyang Ruan <ruansy.fnst@...itsu.com>
Cc: "Darrick J. Wong" <djwong@...nel.org>,
Christoph Hellwig <hch@....de>,
linux-xfs <linux-xfs@...r.kernel.org>,
david <david@...morbit.com>,
linux-fsdevel <linux-fsdevel@...r.kernel.org>,
Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
Linux NVDIMM <nvdimm@...ts.linux.dev>,
Goldwyn Rodrigues <rgoldwyn@...e.de>,
Al Viro <viro@...iv.linux.org.uk>,
Matthew Wilcox <willy@...radead.org>
Subject: Re: [PATCH v7 7/8] fsdax: Introduce dax_iomap_ops for end of reflink
On Sun, Aug 15, 2021 at 11:05 PM Shiyang Ruan <ruansy.fnst@...itsu.com> 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@...itsu.com>
> ---
> 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?
Powered by blists - more mailing lists