• Christoph Hellwig's avatar
    xfs: skip delalloc COW blocks in xfs_reflink_end_cow · f5f3f959
    Christoph Hellwig authored
    The iomap direct I/O code issues a single ->end_io call for the whole
    I/O request, and if some of the extents cowered needed a COW operation
    it will call xfs_reflink_end_cow over the whole range.
    
    When we do AIO writes we drop the iolock after doing the initial setup,
    but before the I/O completion.  Between dropping the lock and completing
    the I/O we can have a racing buffered write create new delalloc COW fork
    extents in the region covered by the outstanding direct I/O write, and
    thus see delalloc COW fork extents in xfs_reflink_end_cow.  As
    concurrent writes are fundamentally racy and no guarantees are given we
    can simply skip those.
    
    This can be easily reproduced with xfstests generic/208 in always_cow
    mode.
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
    
    f5f3f959
xfs_reflink.c 42.7 KB