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