• Christoph Hellwig's avatar
    xfs: fix COW writeback race · d2b3964a
    Christoph Hellwig authored
    Due to the way how xfs_iomap_write_allocate tries to convert the whole
    found extents from delalloc to real space we can run into a race
    condition with multiple threads doing writes to this same extent.
    For the non-COW case that is harmless as the only thing that can happen
    is that we call xfs_bmapi_write on an extent that has already been
    converted to a real allocation.  For COW writes where we move the extent
    from the COW to the data fork after I/O completion the race is, however,
    not quite as harmless.  In the worst case we are now calling
    xfs_bmapi_write on a region that contains hole in the COW work, which
    will trip up an assert in debug builds or lead to file system corruption
    in non-debug builds.  This seems to be reproducible with workloads of
    small O_DSYNC write, although so far I've not managed to come up with
    a with an isolated reproducer.
    
    The fix for the issue is relatively simple:  tell xfs_bmapi_write
    that we are only asked to convert delayed allocations and skip holes
    in that case.
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
    Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    d2b3964a
xfs_iomap.c 32.2 KB