On 2021/9/16 14:23, Christoph Hellwig wrote:
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);
}


I see.  Thanks for your guidance.


--
Ruan



Reply via email to