1.1 is more flexible in a number of ways and is safer. 0.90 is still fully supported. 1.0 should possibly be used for RAID1 arrays that you want to boot off, depending on your boot loader. Signed-off-by: NeilBrown <neilb@suse.de>
234 lines
5.4 KiB
Bash
234 lines
5.4 KiB
Bash
#!/bin/sh
|
|
#
|
|
# run test suite for mdadm
|
|
user=`id -un`
|
|
if [ " $user" != " root" ]
|
|
then echo >&2 "test: testing can only be done as 'root'."
|
|
exit 1;
|
|
fi
|
|
|
|
prefix='[0-9][0-9]'
|
|
if [ -n "$1" ]
|
|
then prefix=$1
|
|
fi
|
|
|
|
dir=`pwd`
|
|
mdadm=$dir/mdadm
|
|
if [ \! -x $mdadm ]
|
|
then
|
|
echo >&2 "test: $mdadm isn't usable."
|
|
fi
|
|
|
|
# assume md0, md1, md2 exist in /dev
|
|
md0=/dev/md0 md1=/dev/md1 md2=/dev/md2
|
|
mdp0=/dev/md_d0
|
|
mdp1=/dev/md_d1
|
|
|
|
# We test mdadm on loop-back block devices.
|
|
# dir for storing files should be settable by command line maybe
|
|
targetdir=/var/tmp
|
|
size=20000
|
|
# super0, round down to multiple of 64 and substract 64
|
|
mdsize0=19904
|
|
# super00 is nested, subtract 128
|
|
mdsize00=19840
|
|
# super1.0 round down to multiple of 2, subtract 8
|
|
mdsize1=19992
|
|
# super1.1 for linear: round to multiple of 2, subtract 4
|
|
mdsize1_l=19996
|
|
# subtract another 4 for bitmaps
|
|
mdsize1b=19988
|
|
mdsize11=19992
|
|
mdsize12=19988
|
|
|
|
# ddf needs bigger devices as 32Meg is reserved!
|
|
ddfsize=65536
|
|
|
|
cleanup() {
|
|
udevadm settle
|
|
$mdadm -Ssq
|
|
for d in 0 1 2 3 4 5 6 7 8 9 10 11 12
|
|
do
|
|
losetup -d /dev/loop$d ; # rm -f $targetdir/mdtest$d
|
|
done
|
|
}
|
|
|
|
trap cleanup 0 1 2 3 15
|
|
|
|
devlist=
|
|
for d in 0 1 2 3 4 5 6 7 8 9 10 11 12
|
|
do
|
|
sz=$size
|
|
if [ $d -gt 7 ]; then sz=$ddfsize ; fi
|
|
[ -f $targetdir/mdtest$d ] || dd if=/dev/zero of=$targetdir/mdtest$d count=$sz bs=1K > /dev/null 2>&1
|
|
[ -b /dev/loop$d ] || mknod /dev/loop$d b 7 $d
|
|
if [ $d -eq 7 ]
|
|
then
|
|
losetup /dev/loop$d $targetdir/mdtest6 # for multipath use
|
|
else
|
|
losetup /dev/loop$d $targetdir/mdtest$d
|
|
fi
|
|
eval dev$d=/dev/loop$d
|
|
eval file$d=$targetdir/mdtest$d
|
|
eval devlist=\"\$devlist \$dev$d\"
|
|
#" <-- add this quote to un-confuse vim syntax highlighting
|
|
done
|
|
path0=$dev6
|
|
path1=$dev7
|
|
|
|
ulimit -c unlimited
|
|
[ -f /proc/mdstat ] || modprobe md_mod
|
|
echo 2000 > /proc/sys/dev/raid/speed_limit_max
|
|
echo 0 > /sys/module/md_mod/parameters/start_ro
|
|
|
|
if [ " $1" = " setup" ]
|
|
then trap 0 ; exit 0
|
|
fi
|
|
|
|
# mdadm always adds --quiet, and we want to see any unexpected messages
|
|
mdadm() {
|
|
rm -f $targetdir/stderr
|
|
case $* in
|
|
*-S* ) udevadm settle;;
|
|
esac
|
|
case $* in
|
|
*-C* ) $mdadm 2> $targetdir/stderr --quiet "$@" --auto=yes;;
|
|
* ) $mdadm 2> $targetdir/stderr --quiet "$@"
|
|
esac
|
|
rv=$?
|
|
cat >&2 $targetdir/stderr
|
|
return $rv
|
|
}
|
|
|
|
# check various things
|
|
check() {
|
|
case $1 in
|
|
spares )
|
|
spares=`tr '] ' '\012\012' < /proc/mdstat | grep -c '(S)' || exit 0`
|
|
if [ $spares -ne $2 ]
|
|
then
|
|
echo >&2 "ERROR expected $2 spares, found $spares"; exit 1;
|
|
fi
|
|
;;
|
|
raid* | linear )
|
|
grep -s "active $1 " /proc/mdstat > /dev/null || {
|
|
echo >&2 "ERROR active $1 not found" ; cat /proc/mdstat ; exit 1;}
|
|
;;
|
|
resync | recovery | reshape)
|
|
sleep 0.5
|
|
grep -s $1 /proc/mdstat > /dev/null || {
|
|
echo >&2 ERROR no $1 happening; cat /proc/mdstat; exit 1; }
|
|
;;
|
|
|
|
nosync )
|
|
sleep 0.5
|
|
if grep -s -E '(resync|recovery|reshape) =' > /dev/null /proc/mdstat ; then
|
|
echo >&2 "ERROR resync or recovery is happening!"; cat /proc/mdstat ; exit 1;
|
|
fi
|
|
;;
|
|
|
|
wait )
|
|
sleep 0.1
|
|
while grep -E '(resync|recovery|reshape|check|repair) =' > /dev/null /proc/mdstat
|
|
do sleep 2;
|
|
done
|
|
;;
|
|
|
|
state )
|
|
grep -s "blocks.*\[$2\]\$" /proc/mdstat > /dev/null || {
|
|
echo >&2 "ERROR state $2 not found!"; cat /proc/mdstat ; exit 1; }
|
|
sleep 0.5
|
|
;;
|
|
|
|
bitmap )
|
|
grep -s bitmap > /dev/null /proc/mdstat || {
|
|
echo >&2 ERROR no bitmap ; cat /proc/mdstat ; exit 1; }
|
|
;;
|
|
nobitmap )
|
|
if grep -s "bitmap" > /dev/null /proc/mdstat
|
|
then
|
|
echo >&2 ERROR bitmap present ; cat /proc/mdstat ; exit 1;
|
|
fi
|
|
;;
|
|
|
|
* ) echo >&2 ERROR unknown check $1 ; exit 1;
|
|
esac
|
|
}
|
|
|
|
no_errors() {
|
|
if [ -s $targetdir/stderr ]
|
|
then echo Bad errors from mdadm: ; cat $targetdir/stderr; exit 2;
|
|
fi
|
|
}
|
|
# basic device test
|
|
|
|
testdev() {
|
|
udevadm settle
|
|
dev=$1
|
|
cnt=$2
|
|
dvsize=$3
|
|
chunk=$4
|
|
if [ -z "$5" ]; then
|
|
mkfs -j $dev > /dev/null 2>&1 && fsck -fn $dev >&2
|
|
fi
|
|
dsize=$[dvsize/chunk]
|
|
dsize=$[dsize*chunk]
|
|
rasize=$[dsize*2*cnt]
|
|
# rasize is in sectors
|
|
if [ -n "$DEV_ROUND_K" ]; then
|
|
rasize=$[rasize/DEV_ROUND_K/2]
|
|
rasize=$[rasize*DEV_ROUND_K*2]
|
|
fi
|
|
if [ `/sbin/blockdev --getsize $dev` -eq 0 ]; then sleep 2 ; fi
|
|
if [ $rasize -ne `/sbin/blockdev --getsize $dev` ]
|
|
then
|
|
echo "ERROR: size is wrong for $dev: $cnt * $dvsize (chunk=$chunk) = $rasize, not `/sbin/blockdev --getsize $dev`"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
rotest() {
|
|
dev=$1
|
|
fsck -fn $dev >&2
|
|
}
|
|
|
|
setup_environment() {
|
|
if [ -f $1 ]; then
|
|
. $environment
|
|
setup_env
|
|
fi
|
|
}
|
|
|
|
reset_environment() {
|
|
if [ -f $1 ]; then
|
|
reset_env
|
|
unset setup_env
|
|
unset reset_env
|
|
fi
|
|
}
|
|
|
|
for script in tests/$prefix tests/$prefix*[^~]
|
|
do
|
|
if [ -f "$script" ]
|
|
then
|
|
rm -f $targetdir/stderr
|
|
# stop all arrays, just incase some script left an array active.
|
|
mdadm -Ssq
|
|
mdadm --zero $devlist 2> /dev/null
|
|
mdadm --zero $devlist 2> /dev/null
|
|
environment="tests/env-`basename $script`"
|
|
setup_environment $environment
|
|
# source script in a subshell, so it has access to our
|
|
# namespace, but cannot change it.
|
|
if ( set -ex ; . $script ) 2> $targetdir/log
|
|
then echo "$script succeeded"
|
|
else cat $targetdir/log ; cat $targetdir/stderr
|
|
echo "$script failed"
|
|
reset_environment $environment
|
|
exit 1
|
|
fi
|
|
reset_environment $environment
|
|
fi
|
|
done
|
|
exit 0
|