From 7c19b781d511211fcee0d9482bbccc7217a5f7f9 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Tue, 22 Mar 2011 10:32:09 +1100 Subject: [PATCH] ddf: fix up detection of failed/missing devices. 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 --- super-ddf.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/super-ddf.c b/super-ddf.c index 93de750..7929364 100644 --- a/super-ddf.c +++ b/super-ddf.c @@ -3033,22 +3033,32 @@ static struct mdinfo *container_content_ddf(struct supertype *st) struct mdinfo *dev; struct dl *d; int stt; + int pd; if (vc->conf.phys_refnum[i] == 0xFFFFFFFF) continue; + for (pd = __be16_to_cpu(ddf->phys->used_pdes); + pd--;) + if (ddf->phys->entries[pd].refnum + == vc->conf.phys_refnum[i]) + break; + if (pd < 0) + continue; + + 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; - stt = __be16_to_cpu(ddf->phys->entries[d->pdnum].state); - if ((stt & (DDF_Online|DDF_Failed|DDF_Rebuilding)) - != DDF_Online) - continue; - - this->array.working_disks++; dev = malloc(sizeof(*dev)); memset(dev, 0, sizeof(*dev));