mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
264: Functional test case for the btrfs snapshot
Create snapshots in various ways, modify the data around the block and file boundaries and verify the data integrity. Signed-off-by: Anand Jain <Anand.Jain@oracle.com> Signed-off-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
committed by
Christoph Hellwig
parent
27a067a7ca
commit
c6c8f381b3
@@ -0,0 +1,193 @@
|
||||
#!/bin/bash
|
||||
# FS QA Test No. 264
|
||||
#
|
||||
# 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
|
||||
#
|
||||
#-----------------------------------------------------------------------
|
||||
#
|
||||
# creator
|
||||
owner=anand.jain@oracle.com
|
||||
|
||||
seq=`basename $0`
|
||||
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
|
||||
|
||||
_scratch_mkfs $SCRATCH_DEV_POOL > /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 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 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
|
||||
Reference in New Issue
Block a user