btrfs: check that cloning an inline extent does not lead to data loss
authorFilipe Manana <fdmanana@suse.com>
Mon, 6 Apr 2020 10:51:34 +0000 (11:51 +0100)
committerEryu Guan <guaneryu@gmail.com>
Sun, 19 Apr 2020 15:32:09 +0000 (23:32 +0800)
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>
tests/btrfs/205
tests/btrfs/205.out

index 9bec2bfad96fd0c6b1eb01460de9284b61cdfa61..66355678f7d29b9d7b486a9de7d27387b3fd6fcd 100755 (executable)
@@ -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
index 948e0634e9be02f85a3ba1ac21fc3bdf3b8796d6..d9932fc09a30a46efc98943ae7ee5e75a95a32f6 100644 (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