]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
ddf: fix up detection of failed/missing devices.
authorNeilBrown <neilb@suse.de>
Mon, 21 Mar 2011 23:32:09 +0000 (10:32 +1100)
committerNeilBrown <neilb@suse.de>
Mon, 21 Mar 2011 23:32:09 +0000 (10:32 +1100)
If a device hasn't been found yet we can still tell if it is
expected to be working, and we must to do to make sure
'working_disks' is correct.

Signed-off-by: NeilBrown <neilb@suse.de>
super-ddf.c

index 72b87ffaf5e5dd1028c99a0f1dea4f4bf62a9d1f..8f88b70837f765a46166cfdde3839711fc8cc600 100644 (file)
@@ -3019,23 +3019,33 @@ static struct mdinfo *container_content_ddf(struct supertype *st, char *subarray
                        struct mdinfo *dev;
                        struct dl *d;
                        int stt;
+                       int pd;
 
                        if (vc->conf.phys_refnum[i] == 0xFFFFFFFF)
                                continue;
 
-                       for (d = ddf->dlist; d ; d=d->next)
-                               if (d->disk.refnum == vc->conf.phys_refnum[i])
+                       for (pd = __be16_to_cpu(ddf->phys->used_pdes);
+                            pd--;)
+                               if (ddf->phys->entries[pd].refnum
+                                   == vc->conf.phys_refnum[i])
                                        break;
-                       if (d == NULL)
-                               /* Haven't found that one yet, maybe there are others */
+                       if (pd < 0)
                                continue;
-                       stt = __be16_to_cpu(ddf->phys->entries[d->pdnum].state);
+
+                       stt = __be16_to_cpu(ddf->phys->entries[pd].state);
                        if ((stt & (DDF_Online|DDF_Failed|DDF_Rebuilding))
                            != DDF_Online)
                                continue;
 
                        this->array.working_disks++;
 
+                       for (d = ddf->dlist; d ; d=d->next)
+                               if (d->disk.refnum == vc->conf.phys_refnum[i])
+                                       break;
+                       if (d == NULL)
+                               /* Haven't found that one yet, maybe there are others */
+                               continue;
+
                        dev = malloc(sizeof(*dev));
                        memset(dev, 0, sizeof(*dev));
                        dev->next = this->devs;