summaryrefslogtreecommitdiff
path: root/tests/09imsm-create-fail-rebuild
blob: 758edc3141e721f185e187489acac37c7fbea96d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# 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