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);
}

Reply via email to