Messages in this thread | | | From | "" <> | Subject | Re: [PATCH v2 09/10] fs/xfs: Handle CoW for fsdax write() path | Date | Wed, 3 Mar 2021 09:57:48 +0000 |
| |
> > 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. | |