mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
7e98d41a6e
Refactor every test in the entire test suite to use the new boilerplate functions. This also migrates all the test group information into the test files. This patch has been autogenerated via the command: ./tools/convert-group btrfs ceph cifs ext4 f2fs generic nfs ocfs2 overlay perf shared udf xfs Signed-off-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Allison Henderson <allison.henderson@oracle.com> Reviewed-by: Eric Biggers <ebiggers@google.com> Signed-off-by: Eryu Guan <guaneryu@gmail.com>
115 lines
4.0 KiB
Bash
Executable File
115 lines
4.0 KiB
Bash
Executable File
#! /bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
# Copyright (C) 2015 SUSE Linux Products GmbH. All Rights Reserved.
|
|
#
|
|
# FS QA Test No. btrfs/094
|
|
#
|
|
# Test that an incremental send issues valid clone operations for compressed
|
|
# file extents.
|
|
#
|
|
# For some compressed extents, namely those referred by a file extent item with
|
|
# a non-zero data offset, btrfs could issue a clone operation in the send stream
|
|
# with an offset and length pair that were not entirely contained in the source
|
|
# file's range, causing the receiving side to get -EINVAL errors from the clone
|
|
# ioctl when attempting to perform the clone operations.
|
|
#
|
|
# This issue was fixed by the following linux kernel btrfs patch:
|
|
#
|
|
# Btrfs: incremental send, fix clone operations for compressed extents
|
|
#
|
|
. ./common/preamble
|
|
_begin_fstest auto quick send
|
|
|
|
# Override the default cleanup function.
|
|
_cleanup()
|
|
{
|
|
rm -fr $send_files_dir
|
|
rm -f $tmp.*
|
|
}
|
|
|
|
# Import common functions.
|
|
. ./common/filter
|
|
|
|
# real QA test starts here
|
|
_supported_fs btrfs
|
|
_require_scratch
|
|
_require_cloner
|
|
|
|
send_files_dir=$TEST_DIR/btrfs-test-$seq
|
|
|
|
rm -fr $send_files_dir
|
|
mkdir $send_files_dir
|
|
|
|
_scratch_mkfs >>$seqres.full 2>&1
|
|
_scratch_mount "-o compress"
|
|
|
|
BLOCK_SIZE=$(_get_block_size $SCRATCH_MNT)
|
|
|
|
# Create the file with a single extent of 32 blocks. This creates a metadata
|
|
# file extent item with a data start offset of 0 and a logical length of
|
|
# 32 blocks.
|
|
$XFS_IO_PROG -f -c "pwrite -S 0xaa $((16 * $BLOCK_SIZE)) $((32 * $BLOCK_SIZE))" \
|
|
-c "fsync" $SCRATCH_MNT/foo | _filter_xfs_io_blocks_modified
|
|
|
|
# Now rewrite the block range [16, 28[ of our file. This will make
|
|
# the inode's metadata continue to point to the single 32 block extent
|
|
# we created before, but now with an extent item that points to the
|
|
# extent with a data start offset referring to the 28th block and a
|
|
# logical length of 4 blocks.
|
|
# That metadata file extent item is associated with the block range
|
|
# [44, 48[.
|
|
$XFS_IO_PROG -c "pwrite -S 0xbb $((16 * $BLOCK_SIZE)) $((28 * $BLOCK_SIZE))" \
|
|
-c "fsync" $SCRATCH_MNT/foo | _filter_xfs_io_blocks_modified
|
|
|
|
# Now rewrite the block range [45, 48[. This will make the inode's
|
|
# metadata continue to point the 32 block extent we created earlier,
|
|
# with a single extent item that points to it with a start offset
|
|
# referring to the 28th block and a logical length of 1 block.
|
|
# That metadata file extent item is associated with the block range
|
|
# [44, 45[.
|
|
$XFS_IO_PROG -c "pwrite -S 0xcc $((45 * $BLOCK_SIZE)) $((3 * $BLOCK_SIZE))" \
|
|
-c "fsync" $SCRATCH_MNT/foo | _filter_xfs_io_blocks_modified
|
|
|
|
_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1
|
|
|
|
# Now clone that same region of the 32 block extent into a new file, so that it
|
|
# gets referenced twice and the incremental send operation below decides to
|
|
# issue a clone operation instead of copying the data.
|
|
touch $SCRATCH_MNT/bar
|
|
$CLONER_PROG -s $((44 * $BLOCK_SIZE)) -d $((44 * $BLOCK_SIZE)) -l $BLOCK_SIZE \
|
|
$SCRATCH_MNT/foo $SCRATCH_MNT/bar
|
|
|
|
_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap2
|
|
|
|
_run_btrfs_util_prog send -f $send_files_dir/1.snap $SCRATCH_MNT/mysnap1
|
|
_run_btrfs_util_prog send -p $SCRATCH_MNT/mysnap1 -f $send_files_dir/2.snap \
|
|
$SCRATCH_MNT/mysnap2
|
|
|
|
echo "File contents in the original filesystem:"
|
|
echo "mysnap1/foo"
|
|
od -t x1 $SCRATCH_MNT/mysnap1/foo | _filter_od
|
|
echo "mysnap2/foo"
|
|
od -t x1 $SCRATCH_MNT/mysnap2/foo | _filter_od
|
|
echo "mysnap2/bar"
|
|
od -t x1 $SCRATCH_MNT/mysnap2/bar | _filter_od
|
|
|
|
# Now recreate the filesystem by receiving both send streams and verify we get
|
|
# the same file contents that the original filesystem had.
|
|
_scratch_unmount
|
|
_scratch_mkfs >>$seqres.full 2>&1
|
|
_scratch_mount
|
|
|
|
_run_btrfs_util_prog receive -f $send_files_dir/1.snap $SCRATCH_MNT
|
|
_run_btrfs_util_prog receive -f $send_files_dir/2.snap $SCRATCH_MNT
|
|
|
|
echo "File contents in the new filesystem:"
|
|
echo "mysnap1/foo"
|
|
od -t x1 $SCRATCH_MNT/mysnap1/foo | _filter_od
|
|
echo "mysnap2/foo"
|
|
od -t x1 $SCRATCH_MNT/mysnap2/foo | _filter_od
|
|
echo "mysnap2/bar"
|
|
od -t x1 $SCRATCH_MNT/mysnap2/bar | _filter_od
|
|
|
|
status=0
|
|
exit
|