]> git.baikalelectronics.ru Git - kernel.git/commit
Btrfs: don't make a file partly checksummed through file clone
authorLi Zefan <lizf@cn.fujitsu.com>
Sun, 18 Sep 2011 14:20:46 +0000 (10:20 -0400)
committerChris Mason <chris.mason@oracle.com>
Sun, 18 Sep 2011 14:20:46 +0000 (10:20 -0400)
commit82618bc994951890bafea8d2f28c4d0cc33fe86a
treed2f11b5f8ddde4bda00798a09b5e2233766f3874
parent305433b4bfd753d3dd8d315fb7d67421e5508b13
Btrfs: don't make a file partly checksummed through file clone

To reproduce the bug:

  # mount /dev/sda7 /mnt
  # dd if=/dev/zero of=/mnt/src bs=4K count=1
  # umount /mnt

  # mount -o nodatasum /dev/sda7 /mnt
  # dd if=/dev/zero of=/mnt/dst bs=4K count=1
  # clone_range -s 4K -l 4K /mnt/src /mnt/dst

  # echo 3 > /proc/sys/vm/drop_caches
  # cat /mnt/dst
  # dmesg
  ...
  btrfs no csum found for inode 258 start 0
  btrfs csum failed ino 258 off 0 csum 2566472073 private 0

It's because part of the file is checksummed and the other part is not,
and then btrfs will complain checksum is not found when we read the file.

Disallow file clone if src and dst file have different checksum flag,
so we ensure a file is completely checksummed or unchecksummed.

Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/ioctl.c