mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
btrfs: send with no-holes enabled, fallocate and hole punching
Test that an incremental send with not corrupt data when the source filesystem has the no-holes feature enabled, a file has prealloc (unwritten) extents that start after its size and hole is punched (after the first snapshot is made) that removes all extents from some offset up to the file's size. This currently fails on any kernel version starting from 3.16, and it's by a patch titled: "Btrfs: incremental send, fix file corruption when no-holes feature is enabled" Signed-off-by: Filipe Manana <fdmanana@suse.com> Reviewed-by: Eryu Guan <guaneryu@gmail.com> Signed-off-by: Eryu Guan <guaneryu@gmail.com>
This commit is contained in:
Executable
+84
@@ -0,0 +1,84 @@
|
||||
#! /bin/bash
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Copyright (C) 2019 SUSE Linux Products GmbH. All Rights Reserved.
|
||||
#
|
||||
# FS QA Test No. 188
|
||||
#
|
||||
# Test that an incremental send with not corrupt data when the source filesystem
|
||||
# has the no-holes feature enabled, a file has prealloc (unwritten) extents that
|
||||
# start after its size and hole is punched (after the first snapshot is made)
|
||||
# that removes all extents from some offset up to the file's size.
|
||||
#
|
||||
seq=`basename $0`
|
||||
seqres=$RESULT_DIR/$seq
|
||||
echo "QA output created by $seq"
|
||||
tmp=/tmp/$$
|
||||
status=1 # failure is the default!
|
||||
trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
|
||||
_cleanup()
|
||||
{
|
||||
cd /
|
||||
rm -f $tmp.*
|
||||
rm -fr $send_files_dir
|
||||
}
|
||||
|
||||
# get standard environment, filters and checks
|
||||
. ./common/rc
|
||||
. ./common/filter
|
||||
|
||||
# real QA test starts here
|
||||
_supported_fs btrfs
|
||||
_supported_os Linux
|
||||
_require_test
|
||||
_require_scratch
|
||||
_require_btrfs_fs_feature "no_holes"
|
||||
_require_btrfs_mkfs_feature "no-holes"
|
||||
_require_xfs_io_command "fpunch"
|
||||
_require_xfs_io_command "falloc" "-k"
|
||||
|
||||
send_files_dir=$TEST_DIR/btrfs-test-$seq
|
||||
|
||||
rm -f $seqres.full
|
||||
rm -fr $send_files_dir
|
||||
mkdir $send_files_dir
|
||||
|
||||
_scratch_mkfs "-O no-holes" >>$seqres.full 2>&1
|
||||
_scratch_mount
|
||||
|
||||
# Create our test file with a prealloc extent that starts beyond its size.
|
||||
$XFS_IO_PROG -f -c "pwrite -S 0xab 0 500K" $SCRATCH_MNT/foobar | _filter_xfs_io
|
||||
$XFS_IO_PROG -c "falloc -k 1200K 800K" $SCRATCH_MNT/foobar
|
||||
|
||||
$BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/base 2>&1 \
|
||||
| _filter_scratch
|
||||
|
||||
$BTRFS_UTIL_PROG send -f $send_files_dir/1.snap $SCRATCH_MNT/base 2>&1 \
|
||||
| _filter_scratch
|
||||
|
||||
# Now punch a hole that drops all the extents within the file's size.
|
||||
$XFS_IO_PROG -c "fpunch 0 500K" $SCRATCH_MNT/foobar
|
||||
|
||||
$BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/incr 2>&1 \
|
||||
| _filter_scratch
|
||||
|
||||
$BTRFS_UTIL_PROG send -p $SCRATCH_MNT/base -f $send_files_dir/2.snap \
|
||||
$SCRATCH_MNT/incr 2>&1 | _filter_scratch
|
||||
|
||||
echo "File digest in the original filesystem:"
|
||||
md5sum $SCRATCH_MNT/incr/foobar | _filter_scratch
|
||||
|
||||
# Now recreate the filesystem by receiving both send streams and verify we get
|
||||
# the same file content that the original filesystem had.
|
||||
_scratch_unmount
|
||||
_scratch_mkfs >>$seqres.full 2>&1
|
||||
_scratch_mount
|
||||
|
||||
$BTRFS_UTIL_PROG receive -f $send_files_dir/1.snap $SCRATCH_MNT
|
||||
$BTRFS_UTIL_PROG receive -f $send_files_dir/2.snap $SCRATCH_MNT
|
||||
|
||||
echo "File digest in the new filesystem:"
|
||||
md5sum $SCRATCH_MNT/incr/foobar | _filter_scratch
|
||||
|
||||
status=0
|
||||
exit
|
||||
@@ -0,0 +1,13 @@
|
||||
QA output created by 188
|
||||
wrote 512000/512000 bytes at offset 0
|
||||
XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
Create a readonly snapshot of 'SCRATCH_MNT' in 'SCRATCH_MNT/base'
|
||||
At subvol SCRATCH_MNT/base
|
||||
Create a readonly snapshot of 'SCRATCH_MNT' in 'SCRATCH_MNT/incr'
|
||||
At subvol SCRATCH_MNT/incr
|
||||
File digest in the original filesystem:
|
||||
816df6f64deba63b029ca19d880ee10a SCRATCH_MNT/incr/foobar
|
||||
At subvol base
|
||||
At snapshot incr
|
||||
File digest in the new filesystem:
|
||||
816df6f64deba63b029ca19d880ee10a SCRATCH_MNT/incr/foobar
|
||||
@@ -190,3 +190,4 @@
|
||||
185 volume
|
||||
186 auto quick send volume
|
||||
187 auto send dedupe clone balance
|
||||
188 auto quick send prealloc punch
|
||||
|
||||
Reference in New Issue
Block a user