imsm_check_hold() { if mdadm --remove $1 $2; then echo "$2 removal from $1 should have been blocked" >&2 cat /proc/mdstat >&2 mdadm -E $2 exit 1 fi } imsm_check_removal() { if ! mdadm --remove $1 $2 ; then echo "$2 removal from $1 should have succeeded" >&2 cat /proc/mdstat >&2 mdadm -E $2 exit 1 fi } imsm_check() { udevadm settle case $1 in container ) grep -s "$(((418 * $2)/2)) blocks super external:imsm" /proc/mdstat > /dev/null || { echo >&2 "ERROR correctly formed container not found"; cat /proc/mdstat; exit 1;} ;; member ) member=$2 num_disks=$3 level=$4 size=$5 offset=$6 chunk=$7 err=0 if [ $level -ne 1 ]; then size=$((size & ~(chunk - 1))) else chunk=64 fi eval `stat -L -c "let major=0x%t; let minor=0x%T;" $member` sysfs=/sys/dev/block/${major}:${minor} if [ ! -f ${sysfs}/md/array_state ]; then echo "member array $member not found" >&2 cat /proc/mdstat >&2 exit 1 fi _chunk=`cat ${sysfs}/md/chunk_size` if [ $chunk -ne $((_chunk/1024)) ]; then echo "chunk mismatch expected $chunk got $_chunk" >&2 err=$((err+1)) fi for i in `seq 0 $((num_disks-1))` do _offset=`cat ${sysfs}/md/rd${i}/offset` if [ $offset -ne $((_offset/2)) ]; then echo "offset mismatch expected $offset got $_offset" >&2 err=$((err+1)) fi _size=`cat ${sysfs}/md/rd${i}/size` if [ $size -ne $_size ]; then echo "size mismatch expected $size got $_size" >&2 err=$((err+1)) fi done if [ $err -gt 0 ]; then echo "$member failed check" >&2 cat /proc/mdstat >&2 mdadm -E /dev/loop0 >&2 exit 1 fi ;; * ) echo >&2 ERROR unknown check $1 ; exit 1; esac } setup_env() { export IMSM_DEVNAME_AS_SERIAL=1 export IMSM_TEST_OROM=1 container=/dev/md/container member0=/dev/md/vol0 member1=/dev/md/vol1 member2=/dev/md/vol2 member3=/dev/md/vol3 member4=/dev/md/vol4 } reset_env() { unset IMSM_DEVNAME_AS_SERIAL unset IMSM_TEST_OROM unset imsm_check unset container unset member0 unset member1 unset member2 unset member3 unset member4 }