From 7a8d5d50145e6f3898bb382360857dcc080a4a78 Mon Sep 17 00:00:00 2001 From: Filipe Manana Date: Wed, 14 Mar 2018 20:11:18 +0000 Subject: [PATCH] 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 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 Reviewed-by: Qu Wenruo Signed-off-by: David Sterba --- .../reflinked-prealloc-extents.img.xz | Bin 0 -> 3244 bytes .../030-reflinked-prealloc-extents/test.sh | 42 ++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 tests/fsck-tests/030-reflinked-prealloc-extents/reflinked-prealloc-extents.img.xz create mode 100755 tests/fsck-tests/030-reflinked-prealloc-extents/test.sh diff --git a/tests/fsck-tests/030-reflinked-prealloc-extents/reflinked-prealloc-extents.img.xz b/tests/fsck-tests/030-reflinked-prealloc-extents/reflinked-prealloc-extents.img.xz new file mode 100644 index 0000000000000000000000000000000000000000..8adf0071328806fa6981f6ef225084e517d1bc3e GIT binary patch literal 3244 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 literal 0 HcmV?d00001 diff --git a/tests/fsck-tests/030-reflinked-prealloc-extents/test.sh b/tests/fsck-tests/030-reflinked-prealloc-extents/test.sh new file mode 100755 index 00000000..63f692bc --- /dev/null +++ b/tests/fsck-tests/030-reflinked-prealloc-extents/test.sh @@ -0,0 +1,42 @@ +#!/bin/bash +# +# 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 +# +# +# mount /dev/sdb /mnt +# umount /mnt + +source "$TEST_TOP/common" + +check_prereq btrfs + +check_image() { + run_check "$TOP/btrfs" check "$1" +} + +check_all_images