186d7f5d3SJohn Marino# Copyright (C) 2008 Red Hat, Inc. All rights reserved. 286d7f5d3SJohn Marino# 386d7f5d3SJohn Marino# This copyrighted material is made available to anyone wishing to use, 486d7f5d3SJohn Marino# modify, copy, or redistribute it subject to the terms and conditions 586d7f5d3SJohn Marino# of the GNU General Public License v.2. 686d7f5d3SJohn Marino# 786d7f5d3SJohn Marino# You should have received a copy of the GNU General Public License 886d7f5d3SJohn Marino# along with this program; if not, write to the Free Software Foundation, 986d7f5d3SJohn Marino# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 1086d7f5d3SJohn Marino 1186d7f5d3SJohn Marinotest_description="foo" # silence test-lib for now 1286d7f5d3SJohn Marino. ./test-lib.sh 1386d7f5d3SJohn Marino 1486d7f5d3SJohn Marinoaux() { 1586d7f5d3SJohn Marino # use just "$@" for verbose operation 1686d7f5d3SJohn Marino "$@" > /dev/null 2> /dev/null 1786d7f5d3SJohn Marino #"$@" 1886d7f5d3SJohn Marino} 1986d7f5d3SJohn Marino 2086d7f5d3SJohn MarinoSTACKTRACE() { 2186d7f5d3SJohn Marino trap - ERR; 2286d7f5d3SJohn Marino i=0; 2386d7f5d3SJohn Marino while FUNC=${FUNCNAME[$i]}; test "$FUNC" != "main"; do 2486d7f5d3SJohn Marino echo "$i ${FUNC}() called from ${BASH_SOURCE[$i]}:${BASH_LINENO[$i]}" 2586d7f5d3SJohn Marino i=$(($i + 1)); 2686d7f5d3SJohn Marino done 2786d7f5d3SJohn Marino} 2886d7f5d3SJohn Marino 2986d7f5d3SJohn Marinoteardown() { 3086d7f5d3SJohn Marino echo $LOOP 3186d7f5d3SJohn Marino echo $PREFIX 3286d7f5d3SJohn Marino 3386d7f5d3SJohn Marino test -n "$PREFIX" && { 3486d7f5d3SJohn Marino rm -rf $G_root_/dev/$PREFIX* 3586d7f5d3SJohn Marino while dmsetup table | grep -q ^$PREFIX; do 3686d7f5d3SJohn Marino for s in `dmsetup table | grep ^$PREFIX| awk '{ print substr($1,1,length($1)-1) }'`; do 3786d7f5d3SJohn Marino dmsetup resume $s 2>/dev/null > /dev/null || true 3886d7f5d3SJohn Marino dmsetup remove $s 2>/dev/null > /dev/null || true 3986d7f5d3SJohn Marino done 4086d7f5d3SJohn Marino done 4186d7f5d3SJohn Marino } 4286d7f5d3SJohn Marino 4386d7f5d3SJohn Marino test -n "$LOOP" && losetup -d $LOOP 4486d7f5d3SJohn Marino test -n "$LOOPFILE" && rm -f $LOOPFILE 4586d7f5d3SJohn Marino} 4686d7f5d3SJohn Marino 4786d7f5d3SJohn Marinoteardown_() { 4886d7f5d3SJohn Marino teardown 4986d7f5d3SJohn Marino cleanup_ # user-overridable cleanup 5086d7f5d3SJohn Marino testlib_cleanup_ # call test-lib cleanup routine, too 5186d7f5d3SJohn Marino} 5286d7f5d3SJohn Marino 5386d7f5d3SJohn Marinomake_ioerror() { 5486d7f5d3SJohn Marino echo 0 10000000 error | dmsetup create ioerror 5586d7f5d3SJohn Marino dmsetup resume ioerror 5686d7f5d3SJohn Marino ln -s $G_dev_/mapper/ioerror $G_dev_/ioerror 5786d7f5d3SJohn Marino} 5886d7f5d3SJohn Marino 5986d7f5d3SJohn Marinoprepare_loop() { 6086d7f5d3SJohn Marino size=$1 6186d7f5d3SJohn Marino test -n "$size" || size=32 6286d7f5d3SJohn Marino 6386d7f5d3SJohn Marino test -n "$LOOP" && return 0 6486d7f5d3SJohn Marino trap 'aux teardown_' EXIT # don't forget to clean up 6586d7f5d3SJohn Marino trap 'set +vex; STACKTRACE; set -vex' ERR 6686d7f5d3SJohn Marino #trap - ERR 6786d7f5d3SJohn Marino 6886d7f5d3SJohn Marino LOOPFILE="$PWD/test.img" 6986d7f5d3SJohn Marino dd if=/dev/zero of="$LOOPFILE" bs=$((1024*1024)) count=1 seek=$(($size-1)) 7086d7f5d3SJohn Marino if LOOP=`losetup -s -f "$LOOPFILE" 2>/dev/null`; then 7186d7f5d3SJohn Marino return 0 7286d7f5d3SJohn Marino elif LOOP=`losetup -f` && losetup $LOOP "$LOOPFILE"; then 7386d7f5d3SJohn Marino # no -s support 7486d7f5d3SJohn Marino return 0 7586d7f5d3SJohn Marino else 7686d7f5d3SJohn Marino # no -f support 7786d7f5d3SJohn Marino # Iterate through $G_dev_/loop{,/}{0,1,2,3,4,5,6,7} 7886d7f5d3SJohn Marino for slash in '' /; do 7986d7f5d3SJohn Marino for i in 0 1 2 3 4 5 6 7; do 8086d7f5d3SJohn Marino local dev=$G_dev_/loop$slash$i 8186d7f5d3SJohn Marino ! losetup $dev >/dev/null 2>&1 || continue 8286d7f5d3SJohn Marino # got a free 8386d7f5d3SJohn Marino losetup "$dev" "$LOOPFILE" 8486d7f5d3SJohn Marino LOOP=$dev 8586d7f5d3SJohn Marino break 8686d7f5d3SJohn Marino done 8786d7f5d3SJohn Marino if [ -n "$LOOP" ]; then 8886d7f5d3SJohn Marino break 8986d7f5d3SJohn Marino fi 9086d7f5d3SJohn Marino done 9186d7f5d3SJohn Marino test -n "$LOOP" # confirm or fail 9286d7f5d3SJohn Marino return 0 9386d7f5d3SJohn Marino fi 9486d7f5d3SJohn Marino exit 1 # should not happen 9586d7f5d3SJohn Marino} 9686d7f5d3SJohn Marino 9786d7f5d3SJohn Marinoprepare_devs() { 9886d7f5d3SJohn Marino local n="$1" 9986d7f5d3SJohn Marino test -z "$n" && n=3 10086d7f5d3SJohn Marino local devsize="$2" 10186d7f5d3SJohn Marino test -z "$devsize" && devsize=33 10286d7f5d3SJohn Marino local pvname="$3" 10386d7f5d3SJohn Marino test -z "$pvname" && pvname="pv" 10486d7f5d3SJohn Marino 10586d7f5d3SJohn Marino prepare_loop $(($n*$devsize)) 10686d7f5d3SJohn Marino 10786d7f5d3SJohn Marino PREFIX="LVMTEST$$" 10886d7f5d3SJohn Marino 10986d7f5d3SJohn Marino if ! loopsz=`blockdev --getsz $LOOP 2>/dev/null`; then 11086d7f5d3SJohn Marino loopsz=`blockdev --getsize $LOOP 2>/dev/null` 11186d7f5d3SJohn Marino fi 11286d7f5d3SJohn Marino 11386d7f5d3SJohn Marino local size=$(($loopsz/$n)) 11486d7f5d3SJohn Marino 11586d7f5d3SJohn Marino for i in `seq 1 $n`; do 11686d7f5d3SJohn Marino local name="${PREFIX}$pvname$i" 11786d7f5d3SJohn Marino local dev="$G_dev_/mapper/$name" 11886d7f5d3SJohn Marino eval "dev$i=$dev" 11986d7f5d3SJohn Marino devs="$devs $dev" 12086d7f5d3SJohn Marino echo 0 $size linear $LOOP $((($i-1)*$size)) > $name.table 12186d7f5d3SJohn Marino dmsetup create $name $name.table 12286d7f5d3SJohn Marino dmsetup resume $name 12386d7f5d3SJohn Marino done 12486d7f5d3SJohn Marino 12586d7f5d3SJohn Marino # set up some default names 12686d7f5d3SJohn Marino vg=${PREFIX}vg 12786d7f5d3SJohn Marino vg1=${PREFIX}vg1 12886d7f5d3SJohn Marino vg2=${PREFIX}vg2 12986d7f5d3SJohn Marino lv=LV 13086d7f5d3SJohn Marino lv1=LV1 13186d7f5d3SJohn Marino lv2=LV2 13286d7f5d3SJohn Marino lv3=LV3 13386d7f5d3SJohn Marino lv4=LV4 13486d7f5d3SJohn Marino} 13586d7f5d3SJohn Marino 13686d7f5d3SJohn Marinodisable_dev() { 13786d7f5d3SJohn Marino for dev in "$@"; do 13886d7f5d3SJohn Marino # first we make the device inaccessible 13986d7f5d3SJohn Marino echo 0 10000000 error | dmsetup load $dev 14086d7f5d3SJohn Marino dmsetup resume $dev 14186d7f5d3SJohn Marino # now let's try to get rid of it if it's unused 14286d7f5d3SJohn Marino #dmsetup remove $dev 14386d7f5d3SJohn Marino done 14486d7f5d3SJohn Marino} 14586d7f5d3SJohn Marino 14686d7f5d3SJohn Marinoenable_dev() { 14786d7f5d3SJohn Marino for dev in "$@"; do 14886d7f5d3SJohn Marino local name=`echo "$dev" | sed -e 's,.*/,,'` 14986d7f5d3SJohn Marino dmsetup create $name $name.table || dmsetup load $name $name.table 15086d7f5d3SJohn Marino dmsetup resume $dev 15186d7f5d3SJohn Marino done 15286d7f5d3SJohn Marino} 15386d7f5d3SJohn Marino 15486d7f5d3SJohn Marinobackup_dev() { 15586d7f5d3SJohn Marino for dev in "$@"; do 15686d7f5d3SJohn Marino dd if=$dev of=$dev.backup bs=1024 15786d7f5d3SJohn Marino done 15886d7f5d3SJohn Marino} 15986d7f5d3SJohn Marino 16086d7f5d3SJohn Marinorestore_dev() { 16186d7f5d3SJohn Marino for dev in "$@"; do 16286d7f5d3SJohn Marino test -e $dev.backup || { 16386d7f5d3SJohn Marino echo "Internal error: $dev not backed up, can't restore!" 16486d7f5d3SJohn Marino exit 1 16586d7f5d3SJohn Marino } 16686d7f5d3SJohn Marino dd of=$dev if=$dev.backup bs=1024 16786d7f5d3SJohn Marino done 16886d7f5d3SJohn Marino} 16986d7f5d3SJohn Marino 17086d7f5d3SJohn Marinoprepare_pvs() { 17186d7f5d3SJohn Marino prepare_devs "$@" 17286d7f5d3SJohn Marino pvcreate $devs 17386d7f5d3SJohn Marino} 17486d7f5d3SJohn Marino 17586d7f5d3SJohn Marinoprepare_vg() { 17686d7f5d3SJohn Marino prepare_pvs "$@" 17786d7f5d3SJohn Marino vgcreate $vg $devs 17886d7f5d3SJohn Marino} 17986d7f5d3SJohn Marino 18086d7f5d3SJohn Marinoprepare_lvmconf() { 18186d7f5d3SJohn Marino local filter="$1" 18286d7f5d3SJohn Marino test -z "$filter" && \ 18386d7f5d3SJohn Marino filter='[ "a/dev\/mirror/", "a/dev\/mapper\/.*pv[0-9_]*$/", "r/.*/" ]' 18486d7f5d3SJohn Marino cat > $G_root_/etc/lvm.conf <<-EOF 18586d7f5d3SJohn Marino devices { 18686d7f5d3SJohn Marino dir = "$G_dev_" 18786d7f5d3SJohn Marino scan = "$G_dev_" 18886d7f5d3SJohn Marino filter = $filter 18986d7f5d3SJohn Marino cache_dir = "$G_root_/etc" 19086d7f5d3SJohn Marino sysfs_scan = 0 19186d7f5d3SJohn Marino } 19286d7f5d3SJohn Marino log { 19386d7f5d3SJohn Marino verbose = $verboselevel 19486d7f5d3SJohn Marino syslog = 0 19586d7f5d3SJohn Marino indent = 1 19686d7f5d3SJohn Marino } 19786d7f5d3SJohn Marino backup { 19886d7f5d3SJohn Marino backup = 0 19986d7f5d3SJohn Marino archive = 0 20086d7f5d3SJohn Marino } 20186d7f5d3SJohn Marino global { 20286d7f5d3SJohn Marino library_dir = "$G_root_/lib" 20386d7f5d3SJohn Marino locking_dir = "$G_root_/var/lock/lvm" 20486d7f5d3SJohn Marino } 20586d7f5d3SJohn MarinoEOF 20686d7f5d3SJohn Marino} 20786d7f5d3SJohn Marino 20886d7f5d3SJohn Marinoset -vexE 20986d7f5d3SJohn Marinoaux prepare_lvmconf 21086d7f5d3SJohn Marino 211