1*86d7f5d3SJohn Marino# Copyright (C) 2008 Red Hat, Inc. All rights reserved. 2*86d7f5d3SJohn Marino# 3*86d7f5d3SJohn Marino# This copyrighted material is made available to anyone wishing to use, 4*86d7f5d3SJohn Marino# modify, copy, or redistribute it subject to the terms and conditions 5*86d7f5d3SJohn Marino# of the GNU General Public License v.2. 6*86d7f5d3SJohn Marino# 7*86d7f5d3SJohn Marino# You should have received a copy of the GNU General Public License 8*86d7f5d3SJohn Marino# along with this program; if not, write to the Free Software Foundation, 9*86d7f5d3SJohn Marino# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 10*86d7f5d3SJohn Marino 11*86d7f5d3SJohn Marinotest_description="foo" # silence test-lib for now 12*86d7f5d3SJohn Marino. ./test-lib.sh 13*86d7f5d3SJohn Marino 14*86d7f5d3SJohn Marinoaux() { 15*86d7f5d3SJohn Marino # use just "$@" for verbose operation 16*86d7f5d3SJohn Marino "$@" > /dev/null 2> /dev/null 17*86d7f5d3SJohn Marino #"$@" 18*86d7f5d3SJohn Marino} 19*86d7f5d3SJohn Marino 20*86d7f5d3SJohn MarinoSTACKTRACE() { 21*86d7f5d3SJohn Marino trap - ERR; 22*86d7f5d3SJohn Marino i=0; 23*86d7f5d3SJohn Marino while FUNC=${FUNCNAME[$i]}; test "$FUNC" != "main"; do 24*86d7f5d3SJohn Marino echo "$i ${FUNC}() called from ${BASH_SOURCE[$i]}:${BASH_LINENO[$i]}" 25*86d7f5d3SJohn Marino i=$(($i + 1)); 26*86d7f5d3SJohn Marino done 27*86d7f5d3SJohn Marino} 28*86d7f5d3SJohn Marino 29*86d7f5d3SJohn Marinoteardown() { 30*86d7f5d3SJohn Marino echo $LOOP 31*86d7f5d3SJohn Marino echo $PREFIX 32*86d7f5d3SJohn Marino 33*86d7f5d3SJohn Marino test -n "$PREFIX" && { 34*86d7f5d3SJohn Marino rm -rf $G_root_/dev/$PREFIX* 35*86d7f5d3SJohn Marino while dmsetup table | grep -q ^$PREFIX; do 36*86d7f5d3SJohn Marino for s in `dmsetup table | grep ^$PREFIX| awk '{ print substr($1,1,length($1)-1) }'`; do 37*86d7f5d3SJohn Marino dmsetup resume $s 2>/dev/null > /dev/null || true 38*86d7f5d3SJohn Marino dmsetup remove $s 2>/dev/null > /dev/null || true 39*86d7f5d3SJohn Marino done 40*86d7f5d3SJohn Marino done 41*86d7f5d3SJohn Marino } 42*86d7f5d3SJohn Marino 43*86d7f5d3SJohn Marino test -n "$LOOP" && losetup -d $LOOP 44*86d7f5d3SJohn Marino test -n "$LOOPFILE" && rm -f $LOOPFILE 45*86d7f5d3SJohn Marino} 46*86d7f5d3SJohn Marino 47*86d7f5d3SJohn Marinoteardown_() { 48*86d7f5d3SJohn Marino teardown 49*86d7f5d3SJohn Marino cleanup_ # user-overridable cleanup 50*86d7f5d3SJohn Marino testlib_cleanup_ # call test-lib cleanup routine, too 51*86d7f5d3SJohn Marino} 52*86d7f5d3SJohn Marino 53*86d7f5d3SJohn Marinomake_ioerror() { 54*86d7f5d3SJohn Marino echo 0 10000000 error | dmsetup create ioerror 55*86d7f5d3SJohn Marino dmsetup resume ioerror 56*86d7f5d3SJohn Marino ln -s $G_dev_/mapper/ioerror $G_dev_/ioerror 57*86d7f5d3SJohn Marino} 58*86d7f5d3SJohn Marino 59*86d7f5d3SJohn Marinoprepare_loop() { 60*86d7f5d3SJohn Marino size=$1 61*86d7f5d3SJohn Marino test -n "$size" || size=32 62*86d7f5d3SJohn Marino 63*86d7f5d3SJohn Marino test -n "$LOOP" && return 0 64*86d7f5d3SJohn Marino trap 'aux teardown_' EXIT # don't forget to clean up 65*86d7f5d3SJohn Marino trap 'set +vex; STACKTRACE; set -vex' ERR 66*86d7f5d3SJohn Marino #trap - ERR 67*86d7f5d3SJohn Marino 68*86d7f5d3SJohn Marino LOOPFILE="$PWD/test.img" 69*86d7f5d3SJohn Marino dd if=/dev/zero of="$LOOPFILE" bs=$((1024*1024)) count=1 seek=$(($size-1)) 70*86d7f5d3SJohn Marino if LOOP=`losetup -s -f "$LOOPFILE" 2>/dev/null`; then 71*86d7f5d3SJohn Marino return 0 72*86d7f5d3SJohn Marino elif LOOP=`losetup -f` && losetup $LOOP "$LOOPFILE"; then 73*86d7f5d3SJohn Marino # no -s support 74*86d7f5d3SJohn Marino return 0 75*86d7f5d3SJohn Marino else 76*86d7f5d3SJohn Marino # no -f support 77*86d7f5d3SJohn Marino # Iterate through $G_dev_/loop{,/}{0,1,2,3,4,5,6,7} 78*86d7f5d3SJohn Marino for slash in '' /; do 79*86d7f5d3SJohn Marino for i in 0 1 2 3 4 5 6 7; do 80*86d7f5d3SJohn Marino local dev=$G_dev_/loop$slash$i 81*86d7f5d3SJohn Marino ! losetup $dev >/dev/null 2>&1 || continue 82*86d7f5d3SJohn Marino # got a free 83*86d7f5d3SJohn Marino losetup "$dev" "$LOOPFILE" 84*86d7f5d3SJohn Marino LOOP=$dev 85*86d7f5d3SJohn Marino break 86*86d7f5d3SJohn Marino done 87*86d7f5d3SJohn Marino if [ -n "$LOOP" ]; then 88*86d7f5d3SJohn Marino break 89*86d7f5d3SJohn Marino fi 90*86d7f5d3SJohn Marino done 91*86d7f5d3SJohn Marino test -n "$LOOP" # confirm or fail 92*86d7f5d3SJohn Marino return 0 93*86d7f5d3SJohn Marino fi 94*86d7f5d3SJohn Marino exit 1 # should not happen 95*86d7f5d3SJohn Marino} 96*86d7f5d3SJohn Marino 97*86d7f5d3SJohn Marinoprepare_devs() { 98*86d7f5d3SJohn Marino local n="$1" 99*86d7f5d3SJohn Marino test -z "$n" && n=3 100*86d7f5d3SJohn Marino local devsize="$2" 101*86d7f5d3SJohn Marino test -z "$devsize" && devsize=33 102*86d7f5d3SJohn Marino local pvname="$3" 103*86d7f5d3SJohn Marino test -z "$pvname" && pvname="pv" 104*86d7f5d3SJohn Marino 105*86d7f5d3SJohn Marino prepare_loop $(($n*$devsize)) 106*86d7f5d3SJohn Marino 107*86d7f5d3SJohn Marino PREFIX="LVMTEST$$" 108*86d7f5d3SJohn Marino 109*86d7f5d3SJohn Marino if ! loopsz=`blockdev --getsz $LOOP 2>/dev/null`; then 110*86d7f5d3SJohn Marino loopsz=`blockdev --getsize $LOOP 2>/dev/null` 111*86d7f5d3SJohn Marino fi 112*86d7f5d3SJohn Marino 113*86d7f5d3SJohn Marino local size=$(($loopsz/$n)) 114*86d7f5d3SJohn Marino 115*86d7f5d3SJohn Marino for i in `seq 1 $n`; do 116*86d7f5d3SJohn Marino local name="${PREFIX}$pvname$i" 117*86d7f5d3SJohn Marino local dev="$G_dev_/mapper/$name" 118*86d7f5d3SJohn Marino eval "dev$i=$dev" 119*86d7f5d3SJohn Marino devs="$devs $dev" 120*86d7f5d3SJohn Marino echo 0 $size linear $LOOP $((($i-1)*$size)) > $name.table 121*86d7f5d3SJohn Marino dmsetup create $name $name.table 122*86d7f5d3SJohn Marino dmsetup resume $name 123*86d7f5d3SJohn Marino done 124*86d7f5d3SJohn Marino 125*86d7f5d3SJohn Marino # set up some default names 126*86d7f5d3SJohn Marino vg=${PREFIX}vg 127*86d7f5d3SJohn Marino vg1=${PREFIX}vg1 128*86d7f5d3SJohn Marino vg2=${PREFIX}vg2 129*86d7f5d3SJohn Marino lv=LV 130*86d7f5d3SJohn Marino lv1=LV1 131*86d7f5d3SJohn Marino lv2=LV2 132*86d7f5d3SJohn Marino lv3=LV3 133*86d7f5d3SJohn Marino lv4=LV4 134*86d7f5d3SJohn Marino} 135*86d7f5d3SJohn Marino 136*86d7f5d3SJohn Marinodisable_dev() { 137*86d7f5d3SJohn Marino for dev in "$@"; do 138*86d7f5d3SJohn Marino # first we make the device inaccessible 139*86d7f5d3SJohn Marino echo 0 10000000 error | dmsetup load $dev 140*86d7f5d3SJohn Marino dmsetup resume $dev 141*86d7f5d3SJohn Marino # now let's try to get rid of it if it's unused 142*86d7f5d3SJohn Marino #dmsetup remove $dev 143*86d7f5d3SJohn Marino done 144*86d7f5d3SJohn Marino} 145*86d7f5d3SJohn Marino 146*86d7f5d3SJohn Marinoenable_dev() { 147*86d7f5d3SJohn Marino for dev in "$@"; do 148*86d7f5d3SJohn Marino local name=`echo "$dev" | sed -e 's,.*/,,'` 149*86d7f5d3SJohn Marino dmsetup create $name $name.table || dmsetup load $name $name.table 150*86d7f5d3SJohn Marino dmsetup resume $dev 151*86d7f5d3SJohn Marino done 152*86d7f5d3SJohn Marino} 153*86d7f5d3SJohn Marino 154*86d7f5d3SJohn Marinobackup_dev() { 155*86d7f5d3SJohn Marino for dev in "$@"; do 156*86d7f5d3SJohn Marino dd if=$dev of=$dev.backup bs=1024 157*86d7f5d3SJohn Marino done 158*86d7f5d3SJohn Marino} 159*86d7f5d3SJohn Marino 160*86d7f5d3SJohn Marinorestore_dev() { 161*86d7f5d3SJohn Marino for dev in "$@"; do 162*86d7f5d3SJohn Marino test -e $dev.backup || { 163*86d7f5d3SJohn Marino echo "Internal error: $dev not backed up, can't restore!" 164*86d7f5d3SJohn Marino exit 1 165*86d7f5d3SJohn Marino } 166*86d7f5d3SJohn Marino dd of=$dev if=$dev.backup bs=1024 167*86d7f5d3SJohn Marino done 168*86d7f5d3SJohn Marino} 169*86d7f5d3SJohn Marino 170*86d7f5d3SJohn Marinoprepare_pvs() { 171*86d7f5d3SJohn Marino prepare_devs "$@" 172*86d7f5d3SJohn Marino pvcreate $devs 173*86d7f5d3SJohn Marino} 174*86d7f5d3SJohn Marino 175*86d7f5d3SJohn Marinoprepare_vg() { 176*86d7f5d3SJohn Marino prepare_pvs "$@" 177*86d7f5d3SJohn Marino vgcreate $vg $devs 178*86d7f5d3SJohn Marino} 179*86d7f5d3SJohn Marino 180*86d7f5d3SJohn Marinoprepare_lvmconf() { 181*86d7f5d3SJohn Marino local filter="$1" 182*86d7f5d3SJohn Marino test -z "$filter" && \ 183*86d7f5d3SJohn Marino filter='[ "a/dev\/mirror/", "a/dev\/mapper\/.*pv[0-9_]*$/", "r/.*/" ]' 184*86d7f5d3SJohn Marino cat > $G_root_/etc/lvm.conf <<-EOF 185*86d7f5d3SJohn Marino devices { 186*86d7f5d3SJohn Marino dir = "$G_dev_" 187*86d7f5d3SJohn Marino scan = "$G_dev_" 188*86d7f5d3SJohn Marino filter = $filter 189*86d7f5d3SJohn Marino cache_dir = "$G_root_/etc" 190*86d7f5d3SJohn Marino sysfs_scan = 0 191*86d7f5d3SJohn Marino } 192*86d7f5d3SJohn Marino log { 193*86d7f5d3SJohn Marino verbose = $verboselevel 194*86d7f5d3SJohn Marino syslog = 0 195*86d7f5d3SJohn Marino indent = 1 196*86d7f5d3SJohn Marino } 197*86d7f5d3SJohn Marino backup { 198*86d7f5d3SJohn Marino backup = 0 199*86d7f5d3SJohn Marino archive = 0 200*86d7f5d3SJohn Marino } 201*86d7f5d3SJohn Marino global { 202*86d7f5d3SJohn Marino library_dir = "$G_root_/lib" 203*86d7f5d3SJohn Marino locking_dir = "$G_root_/var/lock/lvm" 204*86d7f5d3SJohn Marino } 205*86d7f5d3SJohn MarinoEOF 206*86d7f5d3SJohn Marino} 207*86d7f5d3SJohn Marino 208*86d7f5d3SJohn Marinoset -vexE 209*86d7f5d3SJohn Marinoaux prepare_lvmconf 210*86d7f5d3SJohn Marino 211