xfs: convert COW blocks to real blocks before unwritten extent conversion
authorChristoph Hellwig <hch@lst.de>
Mon, 10 Oct 2016 22:03:19 +0000 (09:03 +1100)
committerDave Chinner <david@fromorbit.com>
Mon, 10 Oct 2016 22:03:19 +0000 (09:03 +1100)
We need to splice COW blocks we've completed in xfs_end_io_direct_write
into the data fork before converting unwritten extents.  Otherwise
xfs_bmapi_write might first allocate blocks for any holes in the data
fork, which isn't only not needed but also harmful as it might cause
reserved block underruns in the transaction.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/xfs/xfs_aops.c

index 0e2a931fa72560e82f47872dcd1be17d76d49863..3e57a56cf8294770475e5edd04d03ee5565516fa 100644 (file)
@@ -1547,13 +1547,13 @@ xfs_end_io_direct_write(
                i_size_write(inode, offset + size);
        spin_unlock(&ip->i_flags_lock);
 
+       if (flags & XFS_DIO_FLAG_COW)
+               error = xfs_reflink_end_cow(ip, offset, size);
        if (flags & XFS_DIO_FLAG_UNWRITTEN) {
                trace_xfs_end_io_direct_write_unwritten(ip, offset, size);
 
                error = xfs_iomap_write_unwritten(ip, offset, size);
        }
-       if (flags & XFS_DIO_FLAG_COW)
-               error = xfs_reflink_end_cow(ip, offset, size);
        if (flags & XFS_DIO_FLAG_APPEND) {
                trace_xfs_end_io_direct_write_append(ip, offset, size);