Skip to content
  • Filipe Manana's avatar
    Btrfs: fix data corruption when deduplicating between different files · e9773e97
    Filipe Manana authored
    commit de02b9f6 upstream.
    
    If we deduplicate extents between two different files we can end up
    corrupting data if the source range ends at the size of the source file,
    the source file's size is not aligned to the filesystem's block size
    and the destination range does not go past the size of the destination
    file size.
    
    Example:
    
      $ mkfs.btrfs -f /dev/sdb
      $ mount /dev/sdb /mnt
    
      $ xfs_io -f -c "pwrite -S 0x6b 0 2518890" /mnt/foo
      # The first byte with a value of 0xae starts at an offset (2518890)
      # which is not a multiple of the sector size.
      $ xfs_io -c "pwrite -S 0xae 2518890 102398" /mnt/foo
    
      # Confirm the file content is full of bytes with values 0x6b and 0xae.
      $ od -t x1 /mnt/foo
      0000000 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b
      *
      11467540 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b ae ae ae ae ae ae
      11467560 ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae
      *
      11777540 ae ae ae ae ae ae a...
    e9773e97