]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
imsm: FIX: Add array map state transition for failures during initialization
authorAdam Kwolek <adam.kwolek@intel.com>
Wed, 7 Dec 2011 12:58:15 +0000 (13:58 +0100)
committerNeilBrown <neilb@suse.de>
Thu, 8 Dec 2011 03:08:21 +0000 (14:08 +1100)
During initialization disk failure can occur also. Add code for such case
in imsm_set_disk() to support such event.

Signed-off-by: Adam Kwolek <adam.kwolek@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
super-intel.c

index 973b22fc5bbb058ff5b28486f8dd5de1b838f347..217a1963eec7f489b2b50814d9772c9611472132 100644 (file)
@@ -5718,6 +5718,25 @@ static int is_rebuilding(struct imsm_dev *dev)
                return 0;
 }
 
+static int is_initializing(struct imsm_dev *dev)
+{
+       struct imsm_map *migr_map;
+
+       if (!dev->vol.migr_state)
+               return 0;
+
+       if (migr_type(dev) != MIGR_INIT)
+               return 0;
+
+       migr_map = get_imsm_map(dev, 1);
+
+       if (migr_map->map_state == IMSM_T_STATE_UNINITIALIZED)
+               return 1;
+
+       return 0;
+
+}
+
 static void update_recovery_start(struct intel_super *super,
                                        struct imsm_dev *dev,
                                        struct mdinfo *array)
@@ -6501,6 +6520,12 @@ static void imsm_set_disk(struct active_array *a, int n, int state)
                        super->updates_pending++;
                        break;
                }
+               if (is_initializing(dev)) {
+                       dprintf("while initialization.");
+                       map->map_state = map_state;
+                       super->updates_pending++;
+                       break;
+               }
        break;
        case IMSM_T_STATE_FAILED: /* transition to failed state */
                dprintf("failed: ");