# sanity check array creation 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 " 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 } export IMSM_DEVNAME_AS_SERIAL=1 export IMSM_TEST_OROM=1 export IMSM_NO_PLATFORM=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 # IMSM rounds to multiples of one mebibyte - 1024K DEV_ROUND_K=1024 num_disks=2 mdadm -CR $container -e imsm -n $num_disks $dev0 $dev1 imsm_check container $num_disks # RAID0 + RAID1 size=9000 level=0 chunk=64 offset=0 mdadm -CR $member0 $dev0 $dev1 -n $num_disks -l $level -z $size -c $chunk imsm_check member $member0 $num_disks $level $size $offset $chunk testdev $member0 $num_disks $size $chunk offset=$(((size & ~(chunk - 1)) + 2048)) size=4000 level=1 chunk=0 mdadm -CR $member1 $dev0 $dev1 -n $num_disks -l $level -z $size imsm_check member $member1 $num_disks $level $size $offset $chunk testdev $member1 1 $size 1 check wait mdadm -Ss # RAID10 + RAID5 num_disks=4 mdadm -CR $container -e imsm -n $num_disks $dev0 $dev1 $dev2 $dev3 imsm_check container $num_disks size=9000 level=10 chunk=64 offset=0 mdadm -CR $member0 $dev0 $dev1 $dev2 $dev3 -n $num_disks -l $level -z $size -c $chunk imsm_check member $member0 $num_disks $level $size $offset $chunk testdev $member0 $((num_disks-2)) $size $chunk offset=$(((size & ~(chunk - 1)) + 2048)) size=4000 level=5 mdadm -CR $member1 $dev0 $dev1 $dev2 $dev3 -n $num_disks -l $level -z $size -c $chunk imsm_check member $member1 $num_disks $level $size $offset $chunk testdev $member1 $((num_disks-1)) $size $chunk check wait # FAIL / REBUILD imsm_check_hold $container $dev0 mdadm --fail $member0 $dev0 mdadm --wait-clean --scan imsm_check_removal $container $dev0 mdadm --add $container $dev4 check wait imsm_check_hold $container $dev4