| # An array is assembled incompletely. Some disks will |
| # have later metadata than others. |
| # The array is then reassembled in the "wrong" order - |
| # older meta data first. |
| # This FAILS with mdadm 3.3 |
| . tests/env-ddf-template |
| tmp=$(mktemp /tmp/mdtest-XXXXXX) |
| rm -f $tmp /var/tmp/mdmon.log |
| ret=0 |
| |
| mdadm -CR $container -e ddf -n 4 $dev8 $dev9 $dev10 $dev11 |
| ddf_check container 4 |
| |
| mdadm -CR $member1 -n 4 -l 10 $dev8 $dev10 $dev9 $dev11 -z 10000 |
| mdadm -CR $member0 -n 2 -l 1 $dev8 $dev9 -z 10000 |
| |
| mdadm --wait $member0 || true |
| mdadm --wait $member1 || true |
| |
| mke2fs -F $member0 |
| mke2fs -F $member1 |
| sha_0a=$(sha1_sum $member0) |
| sha_1a=$(sha1_sum $member1) |
| |
| mdadm -Ss |
| sleep 1 |
| |
| # Add all devices except those for $member0 |
| mdadm -I $dev10 |
| mdadm -I $dev11 |
| |
| # Start runnable members ($member1) and write |
| mdadm -IRs || true |
| e2fsck -fy $member1 |
| sha_1b=$(sha1_sum $member1) |
| |
| mdadm -Ss |
| sleep 1 |
| |
| # Seq number should be different now |
| seq8a=$(mdadm -E $dev8 | sed -n 's/^ *Seq : //p') |
| seq10a=$(mdadm -E $dev10 | sed -n 's/^ *Seq : //p') |
| |
| if [ $seq8a -ge $seq10a ]; then |
| ret=1 |
| echo ERROR: sequential number of $dev10 not bigger than $dev8 |
| fi |
| if [ x$sha_1a = x$sha_1b ]; then |
| ret=1 |
| echo ERROR: sha1sums equal after write |
| fi |
| |
| #[ -f /var/tmp/mdmon.log ] && cat /var/tmp/mdmon.log |
| |
| # Now reassemble |
| # Note that we add the previously missing disks first. |
| # $dev10 should have a higher seq number than $dev8 |
| for d in $dev8 $dev9 $dev10 $dev11; do |
| mdadm -I $d |
| done |
| |
| mdadm -IRs || true |
| sha_0c=$(sha1_sum $member0) |
| sha_1c=$(sha1_sum $member1) |
| |
| mdadm -Ss |
| sleep 1 |
| |
| seq8c=$(mdadm -E $dev8 | sed -n 's/^ *Seq : //p') |
| seq10c=$(mdadm -E $dev10 | sed -n 's/^ *Seq : //p') |
| |
| if [ x$sha_0a != x$sha_0c ]; then |
| ret=1 |
| echo ERROR: sha1sum of $member0 has changed |
| fi |
| if [ x$sha_1b != x$sha_1c ]; then |
| ret=1 |
| echo ERROR: sha1sum of $member1 has changed |
| fi |
| if [ \( $seq10a -ge $seq10c \) -o \( $seq8c -ne $seq10c \) ]; then |
| ret=1 |
| echo ERROR: sequential numbers are wrong |
| fi |
| |
| # Expect consistent state |
| for d in $dev10 $dev8; do |
| mdadm -E $d>$tmp |
| for x in 0 1; do |
| egrep 'state\['$x'\] : Optimal, Consistent' $tmp || { |
| ret=1 |
| echo ERROR: $member0 has unexpected state on $d |
| } |
| done |
| if [ x$(egrep -c 'active/Online$' $tmp) != x4 ]; then |
| ret=1 |
| echo ERROR: unexpected number of online disks on $d |
| fi |
| done |
| |
| # Now try assembly |
| if mdadm -A $container $dev8 $dev9 $dev10 $dev11; then |
| mdadm -IR $container |
| sha_0d=$(sha1_sum $member0) |
| sha_1d=$(sha1_sum $member1) |
| mdadm -Ss |
| sleep 1 |
| seq8d=$(mdadm -E $dev8 | sed -n 's/^ *Seq : //p') |
| seq10d=$(mdadm -E $dev10 | sed -n 's/^ *Seq : //p') |
| if [ x$sha_0a != x$sha_0d ]; then |
| ret=1 |
| echo ERROR: sha1sum of $member0 has changed |
| fi |
| if [ x$sha_1b != x$sha_1d ]; then |
| ret=1 |
| echo ERROR: sha1sum of $member1 has changed |
| fi |
| if [ \( $seq10a -ge $seq10d \) -o \( $seq8d -ne $seq10d \) ]; then |
| ret=1 |
| echo ERROR: sequential numbers are wrong |
| fi |
| else |
| ret=1 |
| echo ERROR: assembly failed |
| fi |
| |
| if [ $ret -ne 0 ]; then |
| mdadm -E $dev10 |
| mdadm -E $dev8 |
| fi |
| rm -f $tmp /var/tmp/mdmon.log |
| [ $ret -eq 0 ] |