From cceebc67f1377644b02da0ab50bc7d482eeb9cab Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Mon, 23 Feb 2009 14:26:10 -0700 Subject: [PATCH] imsm: provide a simulated option-rom for regression tests IMSM_NO_PLATFORM turns off checks that should be tested, so provide a IMSM_TEST_OROM variable to allow testing the orom constraints in the mdadm regression suite. Signed-off-by: Dan Williams --- platform-intel.c | 18 +++++ super-intel.c | 2 +- tests/09imsm-create-fail-rebuild | 56 +++++++++++++++ tests/env-08imsm-overlap | 69 ++++++++++++++++++- ...nv-imsm => env-09imsm-create-fail-rebuild} | 35 +++++++++- 5 files changed, 175 insertions(+), 5 deletions(-) create mode 100644 tests/09imsm-create-fail-rebuild mode change 120000 => 100644 tests/env-08imsm-overlap rename tests/{env-imsm => env-09imsm-create-fail-rebuild} (66%) diff --git a/platform-intel.c b/platform-intel.c index 03e4ba79..5160227b 100644 --- a/platform-intel.c +++ b/platform-intel.c @@ -162,6 +162,24 @@ const struct imsm_orom *find_imsm_orom(void) if (populated) return &imsm_orom; + if (check_env("IMSM_TEST_OROM")) { + memset(&imsm_orom, 0, sizeof(imsm_orom)); + imsm_orom.rlc = IMSM_OROM_RLC_RAID0 | IMSM_OROM_RLC_RAID1 | + IMSM_OROM_RLC_RAID10 | IMSM_OROM_RLC_RAID5; + imsm_orom.sss = IMSM_OROM_SSS_4kB | IMSM_OROM_SSS_8kB | + IMSM_OROM_SSS_16kB | IMSM_OROM_SSS_32kB | + IMSM_OROM_SSS_64kB | IMSM_OROM_SSS_128kB | + IMSM_OROM_SSS_256kB | IMSM_OROM_SSS_512kB | + IMSM_OROM_SSS_1MB | IMSM_OROM_SSS_2MB; + imsm_orom.dpa = 6; + imsm_orom.tds = 6; + imsm_orom.vpa = 2; + imsm_orom.vphba = 4; + imsm_orom.attr = imsm_orom.rlc | IMSM_OROM_ATTR_ChecksumVerify; + populated = 1; + return &imsm_orom; + } + if (!platform_has_intel_ahci()) return NULL; diff --git a/super-intel.c b/super-intel.c index f169515c..864a9e9a 100644 --- a/super-intel.c +++ b/super-intel.c @@ -1842,7 +1842,7 @@ static struct intel_super *alloc_super(int creating_imsm) super->create_offset = ~((__u32 ) 0); if (!check_env("IMSM_NO_PLATFORM")) super->orom = find_imsm_orom(); - if (super->orom) { + if (super->orom && !check_env("IMSM_TEST_OROM")) { struct sys_dev *list, *ent; /* find the first intel ahci controller */ diff --git a/tests/09imsm-create-fail-rebuild b/tests/09imsm-create-fail-rebuild new file mode 100644 index 00000000..80695764 --- /dev/null +++ b/tests/09imsm-create-fail-rebuild @@ -0,0 +1,56 @@ +# sanity check array creation + +num_disks=2 +mdadm -CR $container -e imsm -n $num_disks $dev0 $dev1 +imsm_check container $num_disks + +# RAID0 + RAID1 +size=10000 +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=5000 +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=10000 +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=5000 +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 + diff --git a/tests/env-08imsm-overlap b/tests/env-08imsm-overlap deleted file mode 120000 index 98b5d63e..00000000 --- a/tests/env-08imsm-overlap +++ /dev/null @@ -1 +0,0 @@ -env-imsm \ No newline at end of file diff --git a/tests/env-08imsm-overlap b/tests/env-08imsm-overlap new file mode 100644 index 00000000..83557d30 --- /dev/null +++ b/tests/env-08imsm-overlap @@ -0,0 +1,68 @@ +imsm_check() { + 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 + err=0 + + 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 + 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 "offset 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_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 +} + +reset_env() { + unset IMSM_DEVNAME_AS_SERIAL + unset IMSM_NO_PLATFORM + unset imsm_check + unset container + unset member0 + unset member1 + unset member2 + unset member3 + unset member4 +} diff --git a/tests/env-imsm b/tests/env-09imsm-create-fail-rebuild similarity index 66% rename from tests/env-imsm rename to tests/env-09imsm-create-fail-rebuild index 83557d30..2fc90edc 100644 --- a/tests/env-imsm +++ b/tests/env-09imsm-create-fail-rebuild @@ -1,3 +1,21 @@ +imsm_check_hold() { + if [ mdadm --remove $1 $2 -eq 0 ]; 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 -ne 0 ]; then + echo "$2 removal from $1 should have succeeded" >&2 + cat /proc/mdstat >&2 + mdadm -E $2 + exit 1 + fi +} + imsm_check() { case $1 in container ) @@ -10,8 +28,14 @@ imsm_check() { 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 @@ -19,6 +43,11 @@ imsm_check() { 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` @@ -28,7 +57,7 @@ imsm_check() { fi _size=`cat ${sysfs}/md/rd${i}/size` if [ $size -ne $_size ]; then - echo "offset mismatch expected $size got $_size" >&2 + echo "size mismatch expected $size got $_size" >&2 err=$((err+1)) fi done @@ -46,7 +75,7 @@ imsm_check() { setup_env() { export IMSM_DEVNAME_AS_SERIAL=1 - export IMSM_NO_PLATFORM=1 + export IMSM_TEST_OROM=1 container=/dev/md/container member0=/dev/md/vol0 member1=/dev/md/vol1 @@ -57,7 +86,7 @@ setup_env() { reset_env() { unset IMSM_DEVNAME_AS_SERIAL - unset IMSM_NO_PLATFORM + unset IMSM_TEST_OROM unset imsm_check unset container unset member0 -- 2.39.2