Files
apfstests/tests/btrfs/052
T
Theodore Ts'o 76c21d6815 Rename _scratch_mount to _scratch_cycle_mount
This makes it clear when we are using "mount ; umount" versus "mount
-o remount" for most file systems.  The reason for this distinction is
(a) tests may want to test the difference between what happens on the
remount versus the munt paths, (b) with tmpfs, "mount ; umount" will
cause the contents of all of the files to disappear which makes many
tests sad, and (c) some mount options may not be changed using "mount
-o remount".

Currently _scratch_mount performs "_scratch_mount ; _scratch_umount"
so mechnically rename this function to _scratch_cycle_mount.  This was
done mechnically using the script fragment:

git grep "_scratch_remount" | \
	awk -F: '{print $1}' | sort -u | \
	xargs sed -i 's/_scratch_remount/_scratch_cycle_mount/g'

Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
2016-02-19 10:44:53 +11:00

192 lines
6.2 KiB
Bash
Executable File

#! /bin/bash
# FS QA Test No. btrfs/052
#
# Verify that the btrfs ioctl clone operation can operate on the same
# file as a source and target. That is, clone extents within the same
# file.
#
#-----------------------------------------------------------------------
# Copyright (c) 2014 Filipe Manana. All Rights Reserved.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it would be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#-----------------------------------------------------------------------
#
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()
{
rm -fr $tmp
}
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
# real QA test starts here
_supported_fs btrfs
_supported_os Linux
_require_scratch
_require_cloner
_need_to_be_root
rm -f $seqres.full
test_btrfs_clone_same_file()
{
if [ -z $1 ]; then
MOUNT_OPTIONS=""
else
MOUNT_OPTIONS="-O $1"
fi
_scratch_mkfs >/dev/null 2>&1
_scratch_mount $MOUNT_OPTIONS
BLOCK_SIZE=$(get_block_size $SCRATCH_MNT)
EXTENT_SIZE=$((2 * $BLOCK_SIZE))
# Create a file with 5 extents, 4 extents of 2 blocks each and 1 extent
# of 16 blocks.
OFFSET=0
$XFS_IO_PROG -f -c "pwrite -S 0x01 -b $EXTENT_SIZE $OFFSET $EXTENT_SIZE" $SCRATCH_MNT/foo \
| _filter_xfs_io_blocks_modified
sync
OFFSET=$(($OFFSET + $EXTENT_SIZE))
$XFS_IO_PROG -c "pwrite -S 0x02 -b $EXTENT_SIZE $OFFSET $EXTENT_SIZE" $SCRATCH_MNT/foo \
| _filter_xfs_io_blocks_modified
sync
OFFSET=$(($OFFSET + $EXTENT_SIZE))
$XFS_IO_PROG -c "pwrite -S 0x03 -b $EXTENT_SIZE $OFFSET $EXTENT_SIZE" $SCRATCH_MNT/foo \
| _filter_xfs_io_blocks_modified
sync
OFFSET=$(($OFFSET + $EXTENT_SIZE))
$XFS_IO_PROG -c "pwrite -S 0x04 -b $EXTENT_SIZE $OFFSET $EXTENT_SIZE" $SCRATCH_MNT/foo \
| _filter_xfs_io_blocks_modified
sync
OFFSET=$(($OFFSET + $EXTENT_SIZE))
EXTENT_SIZE=$((16 * $BLOCK_SIZE))
$XFS_IO_PROG -c "pwrite -S 0x05 -b $EXTENT_SIZE $OFFSET $EXTENT_SIZE" $SCRATCH_MNT/foo \
| _filter_xfs_io_blocks_modified
sync
# Initial file content.
od -t x1 $SCRATCH_MNT/foo | _filter_od
# Same source and target ranges - must fail.
$CLONER_PROG -s $((2 * $BLOCK_SIZE)) -d $((2 * $BLOCK_SIZE)) \
-l $((2 * $BLOCK_SIZE)) $SCRATCH_MNT/foo $SCRATCH_MNT/foo
# Check file content didn't change.
od -t x1 $SCRATCH_MNT/foo | _filter_od
# Intersection between source and target ranges - must fail too.
# $CLONER_PROG -s 4096 -d 8192 -l 8192 $SCRATCH_MNT/foo $SCRATCH_MNT/foo
$CLONER_PROG -s $((1 * $BLOCK_SIZE)) -d $((2 * $BLOCK_SIZE)) \
-l $((2 * $BLOCK_SIZE)) $SCRATCH_MNT/foo $SCRATCH_MNT/foo
# Check file content didn't change.
od -t x1 $SCRATCH_MNT/foo | _filter_od
# Clone an entire extent from a higher range to a lower range.
$CLONER_PROG -s $((6 * $BLOCK_SIZE)) -d 0 -l $((2 * $BLOCK_SIZE)) \
$SCRATCH_MNT/foo $SCRATCH_MNT/foo
# Check entire file, 0th and 1st blocks now have the same content
# as the 6th and 7th blocks.
od -t x1 $SCRATCH_MNT/foo | _filter_od
# Clone an entire extent from a lower range to a higher range.
$CLONER_PROG -s $((2 * $BLOCK_SIZE)) -d $((4 * $BLOCK_SIZE)) \
-l $((2 * $BLOCK_SIZE)) $SCRATCH_MNT/foo $SCRATCH_MNT/foo
# Check entire file, 0th and 1st blocks now have the same content
# as the 6th and 7th block, and 4th and 5th blocks now has the same
# content as the 2nd and 3rd blocks.
od -t x1 $SCRATCH_MNT/foo | _filter_od
# Now clone 1 extent and an half into the file range starting
# at 16th block So we get the second half of the extent
# starting at 4th block and the whole extent starting at 6th
# block cloned into the middle of the 16 blocks extent that
# starts at 8th block. This makes the clone ioctl process more
# extent items from the b+tree and forces a split of the large
# 16-block extent at the end of the file.
$CLONER_PROG -s $((5 * $BLOCK_SIZE)) -d $((16 * $BLOCK_SIZE)) \
-l $((3 * $BLOCK_SIZE)) $SCRATCH_MNT/foo $SCRATCH_MNT/foo
# Check entire file. Besides the previous changes, we now
# should have 1 block with the value 0x02 at 16th block, and 2
# blocks with value 0x04 starting at the 17th block . The
# block ranges [8, 16[ and [19, 24[ should remain with all
# bytes having the value 0x05.
od -t x1 $SCRATCH_MNT/foo | _filter_od
# Now update 2 blocks of data at offset 0. The extent at this
# position is a clone of the extent at 6th block. Check that
# writing to this offset doesn't change data at 6th block.
$XFS_IO_PROG -c "pwrite -S 0xff -b $((2 * $BLOCK_SIZE)) 0 $((2 * $BLOCK_SIZE))" \
$SCRATCH_MNT/foo | _filter_xfs_io_blocks_modified
od -t x1 $SCRATCH_MNT/foo | _filter_od
# Check that after defragmenting the file and re-mounting, the file
# content remains exactly the same as before.
_run_btrfs_util_prog filesystem defragment $SCRATCH_MNT/foo
_scratch_cycle_mount
od -t x1 $SCRATCH_MNT/foo | _filter_od
# Verify that there are no consistency errors.
_check_scratch_fs
}
# For any of the tests below, regardless of cow/nodatacow/compression, the
# results as observed by an application/user should be exactly the same.
echo "Testing with a cow file (default)"
test_btrfs_clone_same_file
_scratch_unmount
echo "Testing with a nocow file (-O nodatacow)"
test_btrfs_clone_same_file "nodatacow"
_scratch_unmount
echo "Testing with a cow file and lzo compression"
test_btrfs_clone_same_file "compress-force=lzo"
_scratch_unmount
echo "Testing with a cow file and zlib compression"
test_btrfs_clone_same_file "compress-force=zlib"
_scratch_unmount
echo "Testing with a nocow file and lzo compression"
test_btrfs_clone_same_file "nodatacow,compress-force=lzo"
_scratch_unmount
echo "Testing with a nocow file and zlib compression"
test_btrfs_clone_same_file "nodatacow,compress-force=zlib"
status=0
exit