> > On Fri, Feb 26, 2021 at 08:20:29AM +0800, Shiyang Ruan wrote: > > error = iomap_zero_range(VFS_I(ip), offset, len, NULL, > > - &xfs_buffered_write_iomap_ops); > > + IS_DAX(VFS_I(ip)) ? > > + &xfs_dax_write_iomap_ops : &xfs_buffered_write_iomap_ops); > > Please add a xfs_zero_range helper that picks the right iomap_ops > instead of open coding this in a few places. OK. I'll add it. > > > +static int > > +xfs_dax_write_iomap_end( > > + struct inode *inode, > > + loff_t pos, > > + loff_t length, > > + ssize_t written, > > + unsigned int flags, > > + struct iomap *iomap) > > +{ > > + int error = 0; > > + xfs_inode_t *ip = XFS_I(inode); > > + > > + if (pos + written > i_size_read(inode)) { > > + i_size_write(inode, pos + written); > > + error = xfs_setfilesize(ip, pos, written); > > + } > > + if (xfs_is_cow_inode(ip)) > > + error = xfs_reflink_end_cow(ip, pos, written); > > + > > + return error; > > What is the advantage of the ioemap_end handler here? It adds another > indirect funtion call to the fast path, so if we can avoid it, I'd > rather do that. These code were in xfs_file_dax_write(). I moved them into the iomap_end because the mmaped CoW need this. I know this is not so good, but I could not find another better way. Do you have any ideas? > > Also, shouldn't we cancel the COW rather than finishing it when setting > the file size fails? > I did forget about this part. Thanks for pointing out. -- Thanks, Ruan Shiyang.