Messages in this thread | | | Subject | Re: [PATCH v9 7/8] xfs: support CoW in fsdax mode | From | Shiyang Ruan <> | Date | Thu, 16 Sep 2021 16:51:48 +0800 |
| |
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
| |