• Brian Foster's avatar
    xfs: punch out data fork delalloc blocks on COW writeback failure · 5ca5916b
    Brian Foster authored
    If writeback I/O to a COW extent fails, the COW fork blocks are
    punched out and the data fork blocks left alone. It is possible for
    COW fork blocks to overlap non-shared data fork blocks (due to
    cowextsz hint prealloc), however, and writeback unconditionally maps
    to the COW fork whenever blocks exist at the corresponding offset of
    the page undergoing writeback. This means it's quite possible for a
    COW fork extent to overlap delalloc data fork blocks, writeback to
    convert and map to the COW fork blocks, writeback to fail, and
    finally for ioend completion to cancel the COW fork blocks and leave
    stale data fork delalloc blocks around in the inode. The blocks are
    effectively stale because writeback failure also discards dirty page
    state.
    
    If this occurs, it is likely to trigger assert failures, free space
    accounting corruption and failures in unrelated file operations. For
    example, a subsequent reflink attempt of the affected file to a new
    target file will trip over the stale delalloc in the source file and
    fail. Several of these issues are occasionally reproduced by
    generic/648, but are reproducible on demand with the right sequence
    of operations and timely I/O error injection.
    
    To fix this problem, update the ioend failure path to also punch out
    underlying data fork delalloc blocks on I/O error. This is analogous
    to the writeback submission failure path in xfs_discard_page() where
    we might fail to map data fork delalloc blocks and consistent with
    the successful COW writeback completion path, which is responsible
    for unmapping from the data fork and remapping in COW fork blocks.
    
    Fixes: 787eb485 ("xfs: fix and streamline error handling in xfs_end_io")
    Signed-off-by: default avatarBrian Foster <bfoster@redhat.com>
    Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
    Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
    5ca5916b
xfs_aops.c 16.3 KB