Index: mdadm-3.2.2/Monitor.c =================================================================== --- mdadm-3.2.2.orig/Monitor.c +++ mdadm-3.2.2/Monitor.c @@ -444,7 +444,7 @@ static int check_array(struct state *st, * or found by directly examining the array, and return * '1' if the array is degraded, or '0' if it is optimal (or dead). */ - struct { int state, major, minor; } info[MaxDisks]; + struct { int state, major, minor, raid_disk; } info[MaxDisks]; mdu_array_info_t array; struct mdstat_ent *mse = NULL, *mse2; char *dev = st->devname; @@ -578,6 +578,7 @@ static int check_array(struct state *st, info[i].state = disc.state; info[i].major = disc.major; info[i].minor = disc.minor; + info[i].raid_disk = disc.raid_disk; if (disc.major || disc.minor) remaining_disks --; } else @@ -615,12 +616,15 @@ static int check_array(struct state *st, disc.state = newstate; disc.major = info[i].major; disc.minor = info[i].minor; - } else if (mse && mse->pattern && i < (int)strlen(mse->pattern)) { - switch(mse->pattern[i]) { - case 'U': newstate = 6 /* ACTIVE/SYNC */; break; - case '_': newstate = 8 /* REMOVED */; break; + } else if (mse && mse->pattern) { + int j = info[i].raid_disk; + if (j < (int)strlen(mse->pattern)) { + switch(mse->pattern[j]) { + case 'U': newstate = 6 /* ACTIVE/SYNC */; break; + case '_': newstate = 8 /* REMOVED */; break; + } + disc.major = disc.minor = 0; } - disc.major = disc.minor = 0; } if (dv == NULL && st->devid[i]) dv = map_dev_preferred(