Re: [PATCH v9 7/8] xfs: support CoW in fsdax mode

From: Christoph Hellwig
Date: Thu Sep 16 2021 - 02:24:09 EST


On Wed, Sep 15, 2021 at 06:45:00PM +0800, Shiyang Ruan wrote:
> +static int
> +xfs_dax_write_iomap_end(
> + struct inode *inode,
> + loff_t pos,
> + loff_t length,
> + ssize_t written,
> + unsigned flags,
> + struct iomap *iomap)
> +{
> + struct xfs_inode *ip = XFS_I(inode);
> + /*
> + * Usually we use @written to indicate whether the operation was
> + * successful. But it is always positive or zero. The CoW needs the
> + * actual error code from actor(). So, get it from
> + * iomap_iter->processed.
> + */
> + const struct iomap_iter *iter =
> + container_of(iomap, typeof(*iter), iomap);
> +
> + if (!xfs_is_cow_inode(ip))
> + return 0;
> +
> + if (iter->processed <= 0) {
> + xfs_reflink_cancel_cow_range(ip, pos, length, true);
> + return 0;
> + }
> +
> + return xfs_reflink_end_cow(ip, pos, iter->processed);

Didn't we come to the conflusion last time that we don't actually
need to poke into the iomap_iter here as the written argument is equal
to iter->processed if it is > 0:

if (iter->iomap.length && ops->iomap_end) {
ret = ops->iomap_end(iter->inode, iter->pos, iomap_length(iter),
iter->processed > 0 ? iter->processed : 0,
iter->flags, &iter->iomap);
..

So should be able to just do:

static int
xfs_dax_write_iomap_end(
struct inode *inode,
loff_t pos,
loff_t length,
ssize_t written,
unsigned flags,
struct iomap *iomap)
{
struct xfs_inode *ip = XFS_I(inode);

if (!xfs_is_cow_inode(ip))
return 0;

if (!written) {
xfs_reflink_cancel_cow_range(ip, pos, length, true);
return 0;
}

return xfs_reflink_end_cow(ip, pos, written);
}