From: Filipe Manana Date: Mon, 6 Apr 2020 10:51:34 +0000 (+0100) Subject: btrfs: check that cloning an inline extent does not lead to data loss X-Git-Tag: v2022.05.01~826 X-Git-Url: http://git.apps.os.sepia.ceph.com/?p=xfstests-dev.git;a=commitdiff_plain;h=c684b203d1bdcc41fa624efa68f736ffe29b151d btrfs: check that cloning an inline extent does not lead to data loss We have a bug in the current kernel merge window (for 5.7) that results in data loss when cloning an inline extent into a new file (or an empty file. This change adds a test for such case into the existing test case btrfs/205, because it's the test case that tests all the supported scenarios for cloning inline extents in btrfs. Linux kernel commit 4fdb688c7071 ("btrfs: fix lost i_size update after cloning inline extent") fixes the regression. Signed-off-by: Filipe Manana Reviewed-by: Josef Bacik Signed-off-by: Eryu Guan --- diff --git a/tests/btrfs/205 b/tests/btrfs/205 index 9bec2bfa..66355678 100755 --- a/tests/btrfs/205 +++ b/tests/btrfs/205 @@ -128,6 +128,18 @@ run_tests() echo "File bar6 digest = $(_md5_checksum $SCRATCH_MNT/bar6)" + # File foo3 a single inline extent of 500 bytes. + echo "Creating file foo3" + $XFS_IO_PROG -f -c "pwrite -S 0xbf 0 500" $SCRATCH_MNT/foo3 | _filter_xfs_io + + # File bar7 is an empty file, has no extents. + touch $SCRATCH_MNT/bar7 + + echo "Cloning foo3 into bar7" + $XFS_IO_PROG -c "reflink $SCRATCH_MNT/foo3" $SCRATCH_MNT/bar7 | _filter_xfs_io + + echo "File bar7 digest = $(_md5_checksum $SCRATCH_MNT/bar7)" + # Unmount and mount again the filesystem. We want to verify the reflink # operations were durably persisted. _scratch_cycle_mount @@ -139,6 +151,7 @@ run_tests() echo "File bar4 digest = $(_md5_checksum $SCRATCH_MNT/bar4)" echo "File bar5 digest = $(_md5_checksum $SCRATCH_MNT/bar5)" echo "File bar6 digest = $(_md5_checksum $SCRATCH_MNT/bar6)" + echo "File bar7 digest = $(_md5_checksum $SCRATCH_MNT/bar7)" } _scratch_mkfs "-O ^no-holes" >>$seqres.full 2>&1 diff --git a/tests/btrfs/205.out b/tests/btrfs/205.out index 948e0634..d9932fc0 100644 --- a/tests/btrfs/205.out +++ b/tests/btrfs/205.out @@ -52,6 +52,13 @@ Cloning foo1 into bar6 linked 131072/131072 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) File bar6 digest = 4b48829714d20a4e73a0cf1565270076 +Creating file foo3 +wrote 500/500 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +Cloning foo3 into bar7 +linked 0/0 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +File bar7 digest = 67679afda6f846539ca7138452de0171 File digests after mounting again the filesystem: File bar1 digest = e9d03fb5fff30baf3c709f2384dfde67 File bar2 digest = 85678cf32ed48f92ca42ad06d0b63f2a @@ -59,6 +66,7 @@ File bar3 digest = 85678cf32ed48f92ca42ad06d0b63f2a File bar4 digest = 4b48829714d20a4e73a0cf1565270076 File bar5 digest = 4b48829714d20a4e73a0cf1565270076 File bar6 digest = 4b48829714d20a4e73a0cf1565270076 +File bar7 digest = 67679afda6f846539ca7138452de0171 Testing with -o compress @@ -112,6 +120,13 @@ Cloning foo1 into bar6 linked 131072/131072 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) File bar6 digest = 4b48829714d20a4e73a0cf1565270076 +Creating file foo3 +wrote 500/500 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +Cloning foo3 into bar7 +linked 0/0 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +File bar7 digest = 67679afda6f846539ca7138452de0171 File digests after mounting again the filesystem: File bar1 digest = e9d03fb5fff30baf3c709f2384dfde67 File bar2 digest = 85678cf32ed48f92ca42ad06d0b63f2a @@ -119,6 +134,7 @@ File bar3 digest = 85678cf32ed48f92ca42ad06d0b63f2a File bar4 digest = 4b48829714d20a4e73a0cf1565270076 File bar5 digest = 4b48829714d20a4e73a0cf1565270076 File bar6 digest = 4b48829714d20a4e73a0cf1565270076 +File bar7 digest = 67679afda6f846539ca7138452de0171 Testing with -o nodatacow @@ -172,6 +188,13 @@ Cloning foo1 into bar6 linked 131072/131072 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) File bar6 digest = 4b48829714d20a4e73a0cf1565270076 +Creating file foo3 +wrote 500/500 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +Cloning foo3 into bar7 +linked 0/0 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +File bar7 digest = 67679afda6f846539ca7138452de0171 File digests after mounting again the filesystem: File bar1 digest = e9d03fb5fff30baf3c709f2384dfde67 File bar2 digest = 85678cf32ed48f92ca42ad06d0b63f2a @@ -179,6 +202,7 @@ File bar3 digest = 85678cf32ed48f92ca42ad06d0b63f2a File bar4 digest = 4b48829714d20a4e73a0cf1565270076 File bar5 digest = 4b48829714d20a4e73a0cf1565270076 File bar6 digest = 4b48829714d20a4e73a0cf1565270076 +File bar7 digest = 67679afda6f846539ca7138452de0171 Testing with -O no-holes @@ -232,6 +256,13 @@ Cloning foo1 into bar6 linked 131072/131072 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) File bar6 digest = 4b48829714d20a4e73a0cf1565270076 +Creating file foo3 +wrote 500/500 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +Cloning foo3 into bar7 +linked 0/0 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +File bar7 digest = 67679afda6f846539ca7138452de0171 File digests after mounting again the filesystem: File bar1 digest = e9d03fb5fff30baf3c709f2384dfde67 File bar2 digest = 85678cf32ed48f92ca42ad06d0b63f2a @@ -239,3 +270,4 @@ File bar3 digest = 85678cf32ed48f92ca42ad06d0b63f2a File bar4 digest = 4b48829714d20a4e73a0cf1565270076 File bar5 digest = 4b48829714d20a4e73a0cf1565270076 File bar6 digest = 4b48829714d20a4e73a0cf1565270076 +File bar7 digest = 67679afda6f846539ca7138452de0171