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