Btrfs-progs: add fsck test for filesystem with shared prealloc extents
authorFilipe Manana <fdmanana@suse.com>
Wed, 14 Mar 2018 20:11:18 +0000 (20:11 +0000)
committerDavid Sterba <dsterba@suse.com>
Fri, 30 Mar 2018 20:15:54 +0000 (22:15 +0200)
commit7a8d5d50145e6f3898bb382360857dcc080a4a78
tree4f90ac242667053d5b5502e7c15e8a4367fd6a65
parent457a288cb5c7dccd88632dab5a903bd00a2142f0
Btrfs-progs: add fsck test for filesystem with shared prealloc extents

Verify that a filesystem check operation (fsck) does not report the
following scenario as an error:

An extent is shared between two inodes, as a result of clone/reflink
operation, and for one of the inodes, lets call it inode A, the extent is
referenced through a file extent item as a prealloc extent, while for the
other inode, call it inode B, the extent is referenced through a regular
file extent item, that is, it was written to. The goal of this test is to
make sure a filesystem check operation will not report "odd csum items"
errors for the prealloc extent at inode A, because this scenario is valid
since the extent was written through inode B and therefore it is expected
to have checksum items in the filesystem's checksum btree for that shared
extent.

Such scenario can be created with the following steps for example:

 mkfs.btrfs -f /dev/sdb
 mount /dev/sdb /mnt

 touch /mnt/foo
 xfs_io -c "falloc 0 256K" /mnt/foo
 sync

 xfs_io -c "pwrite -S 0xab 0 256K" /mnt/foo
 touch /mnt/bar
 xfs_io -c "reflink /mnt/foo 0 0 256K" /mnt/bar
 xfs_io -c "fsync" /mnt/bar

 <power fail>
 mount /dev/sdb /mnt
 umount /mnt

This scenario is fixed by the following patch for the filesystem checker:

 "Btrfs-progs: check, fix false error reports for shared prealloc extents"

Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
tests/fsck-tests/030-reflinked-prealloc-extents/reflinked-prealloc-extents.img.xz [new file with mode: 0644]
tests/fsck-tests/030-reflinked-prealloc-extents/test.sh [new file with mode: 0755]