From 8401644c3a8b2a15bfed25cedc3c4ec0beff07c2 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Tue, 15 Mar 2011 14:57:46 +1100 Subject: [PATCH] ddf: set Rebuilding flag when adding devices to a degraded array This is a big fragile, but DDF has wierd rules that we aren't really set up to handle properly. When we add a device to a degraded array it must be a spare, so mark it as Rebuilding. Signed-off-by: NeilBrown --- super-ddf.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/super-ddf.c b/super-ddf.c index 9013319..505a5b3 100644 --- a/super-ddf.c +++ b/super-ddf.c @@ -3432,13 +3432,20 @@ static void ddf_process_update(struct supertype *st, for (dl = ddf->dlist; dl; dl = dl->next) { unsigned int dn; unsigned int vn = 0; + int in_degraded = 0; for (vcl = ddf->conflist; vcl ; vcl = vcl->next) for (dn=0; dn < ddf->mppe ; dn++) if (vcl->conf.phys_refnum[dn] == dl->disk.refnum) { + int vstate; dprintf("dev %d has %p at %d\n", dl->pdnum, vcl, vn); dl->vlist[vn++] = vcl; + vstate = ddf->virt->entries[vcl->vcnum].state + & DDF_state_mask; + if (vstate == DDF_state_degraded || + vstate == DDF_state_part_optimal) + in_degraded = 1; break; } while (vn < ddf->max_part) @@ -3446,8 +3453,14 @@ static void ddf_process_update(struct supertype *st, if (dl->vlist[0]) { ddf->phys->entries[dl->pdnum].type &= ~__cpu_to_be16(DDF_Global_Spare); - ddf->phys->entries[dl->pdnum].type |= - __cpu_to_be16(DDF_Active_in_VD); + if (!(ddf->phys->entries[dl->pdnum].type & + __cpu_to_be16(DDF_Active_in_VD))) { + ddf->phys->entries[dl->pdnum].type |= + __cpu_to_be16(DDF_Active_in_VD); + if (in_degraded) + ddf->phys->entries[dl->pdnum].state |= + __cpu_to_be16(DDF_Rebuilding); + } } if (dl->spare) { ddf->phys->entries[dl->pdnum].type &=