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 <fdmanana@suse.com>
Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
This commit is contained in:
Filipe Manana
2020-04-06 11:51:34 +01:00
committed by Eryu Guan
parent 200e7d5310
commit c684b203d1
2 changed files with 45 additions and 0 deletions
+13
View File
@@ -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
+32
View File
@@ -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