Files
apfstests/tests/btrfs/002
T
Stefan Behrens f1dce456c5 xfstests: don't remove the two first devices from SCRATCH_DEV_POOL
Since common/config is executed twice, if SCRATCH_DEV_POOL is configured
via the environment, the current code removes the first device entry twice
which means that you lose the second device for the test.

The fix is to not remove anything from SCRATCH_DEV_POOL anymore.
That used to be done (I can only guess) to allow to pass the
SCRATCH_DEV_POOL as an argument to _scratch_mkfs. Since _scratch_mkfs adds
the SCRATCH_DEV, the pool mustn't contain that device anymore.

A new function _scratch_pool_mkfs is introduced that does the expected
thing.

Signed-off-by: Stefan Behrens <sbehrens@giantdisaster.de>
Reviewed-by: Josef Bacik <jbacik@fusionio.com>
Signed-off-by: Rich Johnston <rjohnston@sgi.com>
2013-08-28 08:33:21 -05:00

193 lines
4.4 KiB
Bash
Executable File

#!/bin/bash
# FS QA Test No. btrfs/002
#
# Extented btrfs snapshot test cases
#
#-----------------------------------------------------------------------
# Copyright (c) 2011 Oracle 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"
here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default!
_cleanup()
{
rm -f $tmp.*
}
trap "_cleanup ; exit \$status" 0 1 2 3 15
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
_need_to_be_root
_supported_fs btrfs
_supported_os Linux
_require_scratch
_require_scratch_dev_pool
_scratch_pool_mkfs > /dev/null 2>&1 || _fail "mkfs failed"
_scratch_mount
# Create and save sha256sum
# arg1 FS to generate sha256
# arg2 File name to save the sha256 output
_save_checksum()
{
local i=0
>$2
cd $1
for i in `find . -type f`; do sha256sum $i >> $2; done
cd $OLDPWD
}
# Verify the sha256sum for a FS
# arg1 FS to be tested
# arg2 sha256 file
_verify_checksum()
{
cd $1
[ -f $2 ] || _fail "checksum file $2 not found"
sha256sum -c $2 | grep "FAILED"
cd $OLDPWD
}
# Create a snapshot
# arg1 dest dir
# Return snapshot name in the SNAPNAME
_create_snap()
{
local x
[ -d $1 ] || _fail "Destination dir $1 not present"
SNAPNAME=`mktemp -u $SCRATCH_MNT/snap.XXXXXX`
$BTRFS_UTIL_PROG subvolume snapshot $1 $SNAPNAME > /dev/null || _fail "snapshot create failed"
}
# Reads and writes new data but does not allocate new blocks
# arg1 FS to be modified
_read_modify_write()
{
local i
local FSIZE
for i in `find $1 -type f`
do
FSIZE=`stat -t $i | cut -d" " -f2`
dd if=$i of=/dev/null obs=$FSIZE count=1 status=noxfer 2>/dev/null &
dd if=/dev/urandom of=$i obs=$FSIZE count=1 status=noxfer 2>/dev/null &
done
wait $!
}
# Fills the allocated blocks
# arg1 FS in question
_fill_blk()
{
local FSIZE
local BLKS
local NBLK
local FALLOC
local WS
for i in `find /$1 -type f`
do
FSIZE=`stat -t $i | cut -d" " -f2`
BLKS=`stat -c "%B" $i`
NBLK=`stat -c "%b" $i`
FALLOC=$(($BLKS * $NBLK))
WS=$(($FALLOC - $FSIZE))
dd if=/dev/urandom of=$i oseek=$FSIZE obs=$WS count=1 status=noxfer 2>/dev/null &
done
wait $!
}
# Append a random size to the files
# arg1 : FS in question
_append_file()
{
local FSIZE
local X
local N
local i
N=0
for i in `find $1 -type f`
do
if [ $N == 0 ]; then
X=$i
FSIZE=`stat -t $X | cut -d" " -f2`
dd if=$X of=$X seek=1 bs=$FSIZE obs=$FSIZE count=1 status=noxfer 2>/dev/null &
N=$(($N+1))
continue
fi
FSIZE=`stat -t $i | cut -d" " -f2`
dd if=$X of=$i seek=1 bs=$FSIZE obs=$FSIZE count=1 status=noxfer 2>/dev/null &
X=$i
done
wait $!
}
##################### real QA test starts here###################################
# sv1 - is just a name nothing spl
firstvol="$SCRATCH_MNT/sv1"
$BTRFS_UTIL_PROG subvolume create $firstvol > /dev/null || _fail "btrfs subvolume create $firstvol failed"
dirp=`mktemp -duq $firstvol/dir.XXXXXX`
_populate_fs -n 1 -f 20 -d 10 -r $dirp -s 10 -x
SNAPNAME=0
_create_snap $firstvol
_save_checksum $firstvol $tmp.sv1.sum
_verify_checksum $SNAPNAME $tmp.sv1.sum
#Append1 the files
_fill_blk $SNAPNAME
_verify_checksum $firstvol $tmp.sv1.sum
#Append2 the files
_append_file $SNAPNAME
_verify_checksum $firstvol $tmp.sv1.sum
#read modify write
_read_modify_write $SNAPNAME
_verify_checksum $firstvol $tmp.sv1.sum
#nested snapshot test
src_vol=$firstvol
for i in `seq 1 7`; do
SNAPNAME=0
_create_snap $src_vol
_verify_checksum $SNAPNAME $tmp.sv1.sum
src_vol=$SNAPNAME
done
# file delete test
SNAPNAME=0
_create_snap $firstvol
tname=`echo $SNAPNAME | rev | cut -d"/" -f1 | rev`
_save_checksum $SNAPNAME $tmp.$tname.sum
\rm -rf $firstvol/*
_verify_checksum $SNAPNAME $tmp.$tname.sum
umount $SCRATCH_DEV || _fail "unmount failed"
echo "Silence is golden"
status=0; exit