]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
imsm: FIX: Check correct slots on disk failure
authorAdam Kwolek <adam.kwolek@intel.com>
Wed, 7 Dec 2011 12:58:38 +0000 (13:58 +0100)
committerNeilBrown <neilb@suse.de>
Thu, 8 Dec 2011 03:08:21 +0000 (14:08 +1100)
When changes are made to 2nd map, slot in second map should be tested
instead first one /as change will be applied to second map).

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

index 9689fdd48cf7e2c6ccc6cc2a25068554cc4a8eb8..7f9c64fbb094b161c8272bf09445db32a6ddebd7 100644 (file)
@@ -4522,14 +4522,16 @@ static int add_to_super_imsm_volume(struct supertype *st, mdu_disk_info_t *dk,
                        set_imsm_ord_tbl_ent(map, slot, df->index | IMSM_ORD_REBUILD);
                        if (is_gen_migration(dev)) {
                                struct imsm_map *map2 = get_imsm_map(dev, 1);
-                               if (slot < map2->num_members) {
+                               int slot2 = get_imsm_disk_slot(map2, df->index);
+                               if ((slot2 < map2->num_members) &&
+                                   (slot2 >= 0)) {
                                        __u32 ord2 = get_imsm_ord_tbl_ent(dev,
-                                                                         slot,
+                                                                         slot2,
                                                                          1);
                                        if ((unsigned)df->index ==
                                                               ord_to_idx(ord2))
                                                set_imsm_ord_tbl_ent(map2,
-                                                       slot,
+                                                       slot2,
                                                        df->index |
                                                        IMSM_ORD_REBUILD);
                                }
@@ -6164,8 +6166,11 @@ static int mark_failure(struct imsm_dev *dev, struct imsm_disk *disk, int idx)
         */
        if (dev->vol.migr_state) {
                struct imsm_map *map2 = get_imsm_map(dev, 1);
-               if (slot < map2->num_members)
-                       set_imsm_ord_tbl_ent(map2, slot,
+               int slot2 = get_imsm_disk_slot(map2, idx);
+
+               if ((slot2 < map2->num_members) &&
+                   (slot2 >= 0))
+                       set_imsm_ord_tbl_ent(map2, slot2,
                                             idx | IMSM_ORD_REBUILD);
        }
        if (map->failed_disk_num == 0xff)