• Darrick J. Wong's avatar
    vfs: avoid problematic remapping requests into partial EOF block · 07d19dc9
    Darrick J. Wong authored
    A deduplication data corruption is exposed in XFS and btrfs. It is
    caused by extending the block match range to include the partial EOF
    block, but then allowing unknown data beyond EOF to be considered a
    "match" to data in the destination file because the comparison is only
    made to the end of the source file. This corrupts the destination file
    when the source extent is shared with it.
    
    The VFS remapping prep functions  only support whole block dedupe, but
    we still need to appear to support whole file dedupe correctly.  Hence
    if the dedupe request includes the last block of the souce file, don't
    include it in the actual dedupe operation. If the rest of the range
    dedupes successfully, then reject the entire request.  A subsequent
    patch will enable us to shorten dedupe requests correctly.
    
    When reflinking sub-file ranges, a data corruption can occur when the
    source file range includes a partial EOF block. This shares the unknown
    data beyond EOF into the second file at a position inside EOF, exposing
    stale data in the second file.
    
    If the reflink request includes the last block of the souce file, only
    proceed with the reflink operation if it lands at or past the
    destination file's current EOF. If it lands within the destination file
    EOF, reject the entire request with -EINVAL and make the caller go the
    hard way.  A subsequent patch will enable us to shorten reflink requests
    correctly.
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
    07d19dc9
read_write.c 48 KB