xref: /netbsd-src/external/gpl2/lvm2/dist/test/test-utils.sh (revision 7c604eea85b4f330dc75ffe65e947f4d73758aa0)
156a34939Shaad# Copyright (C) 2008 Red Hat, Inc. All rights reserved.
256a34939Shaad#
356a34939Shaad# This copyrighted material is made available to anyone wishing to use,
456a34939Shaad# modify, copy, or redistribute it subject to the terms and conditions
556a34939Shaad# of the GNU General Public License v.2.
656a34939Shaad#
756a34939Shaad# You should have received a copy of the GNU General Public License
856a34939Shaad# along with this program; if not, write to the Free Software Foundation,
956a34939Shaad# Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
1056a34939Shaad
1156a34939Shaadtest_description="foo" # silence test-lib for now
1256a34939Shaad. ./test-lib.sh
1356a34939Shaad
1456a34939Shaadaux() {
1556a34939Shaad        # use just "$@" for verbose operation
1656a34939Shaad	"$@" > /dev/null 2> /dev/null
1756a34939Shaad	#"$@"
1856a34939Shaad}
1956a34939Shaad
2056a34939ShaadSTACKTRACE() {
2156a34939Shaad	trap - ERR;
2256a34939Shaad	i=0;
2356a34939Shaad	while FUNC=${FUNCNAME[$i]}; test "$FUNC" != "main"; do
2456a34939Shaad		echo "$i ${FUNC}() called from ${BASH_SOURCE[$i]}:${BASH_LINENO[$i]}"
2556a34939Shaad		i=$(($i + 1));
2656a34939Shaad	done
2756a34939Shaad}
2856a34939Shaad
2956a34939Shaadteardown() {
3056a34939Shaad	echo $LOOP
3156a34939Shaad	echo $PREFIX
3256a34939Shaad
3356a34939Shaad	test -n "$PREFIX" && {
34bec4d750Shaad		rm -rf $G_root_/dev/$PREFIX*
3556a34939Shaad		while dmsetup table | grep -q ^$PREFIX; do
36*7c604eeaShaad			for s in `dmsetup table | grep ^$PREFIX| awk '{ print substr($1,1,length($1)-1) }'`; do
3756a34939Shaad				dmsetup resume $s 2>/dev/null > /dev/null || true
3856a34939Shaad				dmsetup remove $s 2>/dev/null > /dev/null || true
3956a34939Shaad			done
4056a34939Shaad		done
4156a34939Shaad	}
4256a34939Shaad
4356a34939Shaad	test -n "$LOOP" && losetup -d $LOOP
4456a34939Shaad	test -n "$LOOPFILE" && rm -f $LOOPFILE
45bec4d750Shaad}
4656a34939Shaad
47bec4d750Shaadteardown_() {
48bec4d750Shaad	teardown
4956a34939Shaad	cleanup_ # user-overridable cleanup
5056a34939Shaad	testlib_cleanup_ # call test-lib cleanup routine, too
5156a34939Shaad}
5256a34939Shaad
5356a34939Shaadmake_ioerror() {
5456a34939Shaad	echo 0 10000000 error | dmsetup create ioerror
5556a34939Shaad	dmsetup resume ioerror
56bec4d750Shaad	ln -s $G_dev_/mapper/ioerror $G_dev_/ioerror
5756a34939Shaad}
5856a34939Shaad
5956a34939Shaadprepare_loop() {
6056a34939Shaad	size=$1
6156a34939Shaad	test -n "$size" || size=32
6256a34939Shaad
6356a34939Shaad	test -n "$LOOP" && return 0
64bec4d750Shaad	trap 'aux teardown_' EXIT # don't forget to clean up
6556a34939Shaad	trap 'set +vex; STACKTRACE; set -vex' ERR
6656a34939Shaad	#trap - ERR
6756a34939Shaad
6856a34939Shaad	LOOPFILE="$PWD/test.img"
6956a34939Shaad	dd if=/dev/zero of="$LOOPFILE" bs=$((1024*1024)) count=1 seek=$(($size-1))
7056a34939Shaad	if LOOP=`losetup -s -f "$LOOPFILE" 2>/dev/null`; then
7156a34939Shaad		return 0
7256a34939Shaad	elif LOOP=`losetup -f` && losetup $LOOP "$LOOPFILE"; then
7356a34939Shaad		# no -s support
7456a34939Shaad		return 0
7556a34939Shaad	else
7656a34939Shaad		# no -f support
77bec4d750Shaad		# Iterate through $G_dev_/loop{,/}{0,1,2,3,4,5,6,7}
7856a34939Shaad		for slash in '' /; do
79bec4d750Shaad			for i in 0 1 2 3 4 5 6 7; do
8056a34939Shaad				local dev=$G_dev_/loop$slash$i
8156a34939Shaad				! losetup $dev >/dev/null 2>&1 || continue
8256a34939Shaad				# got a free
8356a34939Shaad				losetup "$dev" "$LOOPFILE"
8456a34939Shaad				LOOP=$dev
85bec4d750Shaad				break
8656a34939Shaad			done
87bec4d750Shaad			if [ -n "$LOOP" ]; then
88bec4d750Shaad				break
89bec4d750Shaad			fi
9056a34939Shaad		done
9156a34939Shaad		test -n "$LOOP" # confirm or fail
9256a34939Shaad		return 0
9356a34939Shaad	fi
9456a34939Shaad	exit 1 # should not happen
9556a34939Shaad}
9656a34939Shaad
9756a34939Shaadprepare_devs() {
9856a34939Shaad	local n="$1"
9956a34939Shaad	test -z "$n" && n=3
10056a34939Shaad	local devsize="$2"
10156a34939Shaad	test -z "$devsize" && devsize=33
102*7c604eeaShaad	local pvname="$3"
103*7c604eeaShaad	test -z "$pvname" && pvname="pv"
10456a34939Shaad
10556a34939Shaad	prepare_loop $(($n*$devsize))
10656a34939Shaad
10756a34939Shaad	PREFIX="LVMTEST$$"
10856a34939Shaad
109bec4d750Shaad	if ! loopsz=`blockdev --getsz $LOOP 2>/dev/null`; then
110bec4d750Shaad  		loopsz=`blockdev --getsize $LOOP 2>/dev/null`
111bec4d750Shaad	fi
112bec4d750Shaad
11356a34939Shaad	local size=$(($loopsz/$n))
11456a34939Shaad
11556a34939Shaad	for i in `seq 1 $n`; do
116*7c604eeaShaad		local name="${PREFIX}$pvname$i"
11756a34939Shaad		local dev="$G_dev_/mapper/$name"
11856a34939Shaad		eval "dev$i=$dev"
11956a34939Shaad		devs="$devs $dev"
12056a34939Shaad		echo 0 $size linear $LOOP $((($i-1)*$size)) > $name.table
12156a34939Shaad		dmsetup create $name $name.table
12256a34939Shaad		dmsetup resume $name
12356a34939Shaad	done
12456a34939Shaad
12556a34939Shaad    # set up some default names
12656a34939Shaad	vg=${PREFIX}vg
12756a34939Shaad	vg1=${PREFIX}vg1
12856a34939Shaad	vg2=${PREFIX}vg2
12956a34939Shaad	lv=LV
13056a34939Shaad	lv1=LV1
13156a34939Shaad	lv2=LV2
13256a34939Shaad	lv3=LV3
133*7c604eeaShaad	lv4=LV4
13456a34939Shaad}
13556a34939Shaad
13656a34939Shaaddisable_dev() {
13756a34939Shaad	for dev in "$@"; do
13856a34939Shaad        # first we make the device inaccessible
13956a34939Shaad		echo 0 10000000 error | dmsetup load $dev
14056a34939Shaad		dmsetup resume $dev
14156a34939Shaad        # now let's try to get rid of it if it's unused
14256a34939Shaad        #dmsetup remove $dev
14356a34939Shaad	done
14456a34939Shaad}
14556a34939Shaad
14656a34939Shaadenable_dev() {
14756a34939Shaad	for dev in "$@"; do
14856a34939Shaad		local name=`echo "$dev" | sed -e 's,.*/,,'`
14956a34939Shaad		dmsetup create $name $name.table || dmsetup load $name $name.table
15056a34939Shaad		dmsetup resume $dev
15156a34939Shaad	done
15256a34939Shaad}
15356a34939Shaad
154bec4d750Shaadbackup_dev() {
155bec4d750Shaad	for dev in "$@"; do
156bec4d750Shaad		dd if=$dev of=$dev.backup bs=1024
157bec4d750Shaad	done
158bec4d750Shaad}
159bec4d750Shaad
160bec4d750Shaadrestore_dev() {
161bec4d750Shaad	for dev in "$@"; do
162bec4d750Shaad		test -e $dev.backup || {
163bec4d750Shaad			echo "Internal error: $dev not backed up, can't restore!"
164bec4d750Shaad			exit 1
165bec4d750Shaad		}
166bec4d750Shaad		dd of=$dev if=$dev.backup bs=1024
167bec4d750Shaad	done
168bec4d750Shaad}
169bec4d750Shaad
17056a34939Shaadprepare_pvs() {
17156a34939Shaad	prepare_devs "$@"
17256a34939Shaad	pvcreate $devs
17356a34939Shaad}
17456a34939Shaad
17556a34939Shaadprepare_vg() {
17656a34939Shaad	prepare_pvs "$@"
17756a34939Shaad	vgcreate $vg $devs
17856a34939Shaad}
17956a34939Shaad
18056a34939Shaadprepare_lvmconf() {
181*7c604eeaShaad	local filter="$1"
182*7c604eeaShaad	test -z "$filter" && \
183*7c604eeaShaad		filter='[ "a/dev\/mirror/", "a/dev\/mapper\/.*pv[0-9_]*$/", "r/.*/" ]'
18456a34939Shaad	cat > $G_root_/etc/lvm.conf <<-EOF
18556a34939Shaad  devices {
18656a34939Shaad    dir = "$G_dev_"
18756a34939Shaad    scan = "$G_dev_"
188*7c604eeaShaad    filter = $filter
18956a34939Shaad    cache_dir = "$G_root_/etc"
19056a34939Shaad    sysfs_scan = 0
19156a34939Shaad  }
19256a34939Shaad  log {
19356a34939Shaad    verbose = $verboselevel
19456a34939Shaad    syslog = 0
19556a34939Shaad    indent = 1
19656a34939Shaad  }
19756a34939Shaad  backup {
19856a34939Shaad    backup = 0
19956a34939Shaad    archive = 0
20056a34939Shaad  }
20156a34939Shaad  global {
20256a34939Shaad    library_dir = "$G_root_/lib"
20356a34939Shaad     locking_dir = "$G_root_/var/lock/lvm"
20456a34939Shaad  }
20556a34939ShaadEOF
20656a34939Shaad}
20756a34939Shaad
20856a34939Shaadset -vexE
20956a34939Shaadaux prepare_lvmconf
21056a34939Shaad
211