Files
apfstests/tests/btrfs/149
T
Anand Jain cc8831f9a5 btrfs/149: make it sectorsize independent
Originally this test case was designed to work with 4K sectorsize.
Now enhance it to work with any sector sizes and makes the following
changes:
.out file not to contain any traces of sector size.
Use max_inline=0 mount option so that it meets the requisite of non inline
regular extent.
Don't log the md5sum results to the output file as the data size vary by
the sectorsize.

Signed-off-by: Anand Jain <anand.jain@oracle.com>
Reviewed-by: Eryu Guan <guaneryu@gmail.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
2018-09-16 19:56:08 +08:00

111 lines
3.9 KiB
Bash
Executable File

#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2017 SUSE Linux Products GmbH. All Rights Reserved.
#
# FS QA Test No. btrfs/149
#
# Test that an incremental send/receive operation will not fail when the
# destination filesystem has compression enabled and the source filesystem
# has an extent at a file offset 0 that is not compressed and that is
# shared.
#
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 -fr $send_files_dir
rm -f $tmp.*
}
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
. ./common/reflink
# real QA test starts here
_supported_fs btrfs
_supported_os Linux
_require_test
_require_scratch
_require_scratch_reflink
_require_odirect
_require_btrfs_command inspect-internal dump-super
send_files_dir=$TEST_DIR/btrfs-test-$seq
rm -f $seqres.full
rm -fr $send_files_dir
mkdir $send_files_dir
_scratch_mkfs >>$seqres.full 2>&1
# On 64K pagesize systems the compression is more efficient, so max_inline
# helps to create regular (non inline) extent irrespective of the final
# write size.
_scratch_mount "-o compress -o max_inline=0"
# Write to our file using direct IO, so that this way the write ends up not
# getting compressed, that is, we get a regular extent which is neither
# inlined nor compressed.
# Alternatively, we could have mounted the fs without compression enabled,
# which would result as well in an uncompressed regular extent.
sectorsize=$(_scratch_btrfs_sectorsize)
$XFS_IO_PROG -f -d -c "pwrite -S 0xab 0 $sectorsize" $SCRATCH_MNT/foobar |\
_filter_xfs_io_numbers
$BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT \
$SCRATCH_MNT/mysnap1 > /dev/null
# Clone the regular (not inlined) extent.
$XFS_IO_PROG -c \
"reflink $SCRATCH_MNT/foobar 0 $((2 * $sectorsize)) $sectorsize" \
$SCRATCH_MNT/foobar | _filter_xfs_io_numbers
$BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT \
$SCRATCH_MNT/mysnap2 > /dev/null
$BTRFS_UTIL_PROG send -f $send_files_dir/1.snap \
$SCRATCH_MNT/mysnap1 2>&1 >/dev/null | _filter_scratch
# Now do an incremental send of the second snapshot. The send stream can have
# a clone operation to clone the extent at offset 0 to offset (2 x sectorsize).
# This operation would fail on the receiver if it has compression enabled, since
# the write operation of the extent at offset 0 was compressed because it was a
# buffered write operation, and btrfs' clone implementation does not allow
# cloning inline extents to offsets different from 0.
$BTRFS_UTIL_PROG send -p $SCRATCH_MNT/mysnap1 -f $send_files_dir/2.snap \
$SCRATCH_MNT/mysnap2 2>&1 >/dev/null | _filter_scratch
sum_src_snap1=$(md5sum $SCRATCH_MNT/mysnap1/foobar | awk '{print $1}')
sum_src_snap2=$(md5sum $SCRATCH_MNT/mysnap2/foobar | awk '{print $1}')
echo "File digests in the original filesystem:" >> $seqres.full
echo "md5sum $SCRATCH_MNT/mysnap1/foobar " $sum_src_snap1 >> $seqres.full
echo "md5sum $SCRATCH_MNT/mysnap2/foobar " $sum_src_snap2 >> $seqres.full
# 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 "-o compress"
$BTRFS_UTIL_PROG receive -f $send_files_dir/1.snap $SCRATCH_MNT > /dev/null
$BTRFS_UTIL_PROG receive -f $send_files_dir/2.snap $SCRATCH_MNT > /dev/null
sum_dest_snap1=$(md5sum $SCRATCH_MNT/mysnap1/foobar | awk '{print $1}')
sum_dest_snap2=$(md5sum $SCRATCH_MNT/mysnap2/foobar | awk '{print $1}')
echo "File digests in the new filesystem:" | tee -a $seqres.full
echo "md5sum $SCRATCH_MNT/mysnap1/foobar " $sum_src_snap1 >> $seqres.full
echo "md5sum $SCRATCH_MNT/mysnap2/foobar " $sum_src_snap2 >> $seqres.full
[[ $sum_src_snap1 == $sum_dest_snap1 ]] && echo "src and dest 'mysnap1' checksum matched"
[[ $sum_src_snap2 == $sum_dest_snap2 ]] && echo "src and dest 'mysnap2' checksum matched"
status=0
exit