From: Adam Kwolek Date: Tue, 6 Dec 2011 00:27:57 +0000 (+1100) Subject: imsm: FIX: Finalize degraded migration X-Git-Tag: mdadm-3.2.3~50 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bf2f00718640b5c5cad3076344d347d885b523f9;p=thirdparty%2Fmdadm.git imsm: FIX: Finalize degraded migration Currently mdadm for IMSM can finalize not-degraded migration only. Add support for IMSM for migration finalization when array are is degraded state. Signed-off-by: Adam Kwolek Signed-off-by: NeilBrown --- diff --git a/super-intel.c b/super-intel.c index 5ad810c6..5827d139 100644 --- a/super-intel.c +++ b/super-intel.c @@ -6416,20 +6416,24 @@ static void imsm_set_disk(struct active_array *a, int n, int state) a->last_checkpoint = 0; } else if (is_gen_migration(dev)) { dprintf("imsm: Detected General Migration in state: "); - if (map_state == IMSM_T_STATE_NORMAL) { - end_migration(dev, map_state); + + switch (map_state) { + case IMSM_T_STATE_NORMAL: + dprintf("normal\n"); + if (a->last_checkpoint >= a->info.component_size) + end_migration(dev, map_state); map = get_imsm_map(dev, 0); map->failed_disk_num = ~0; - dprintf("normal\n"); - } else { - if (map_state == IMSM_T_STATE_DEGRADED) { - printf("degraded\n"); + break; + case IMSM_T_STATE_DEGRADED: + dprintf("degraded\n"); + if (a->last_checkpoint >= a->info.component_size) end_migration(dev, map_state); - } else { - dprintf("failed\n"); - } - map->map_state = map_state; + break; + default: + dprintf("failed\n"); } + map->map_state = map_state; super->updates_pending++; } }