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