]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
imsm: fix spare promotion
authorDan Williams <dan.j.williams@intel.com>
Tue, 15 Sep 2009 18:34:20 +0000 (11:34 -0700)
committerDan Williams <dan.j.williams@intel.com>
Tue, 15 Sep 2009 18:34:20 +0000 (11:34 -0700)
1/ Fix an off by one error when detecting whether the device allocation
   loop succeeded or not
2/ Update ->num_raid_devs before copying to avoid a segmentation fault

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
super-intel.c

index 782519e937aeab3655b58b41f7aa2e36ca4bc968..4e2b75f07b696fe404f661b99b71f6d31a9db6ce 100644 (file)
@@ -1499,18 +1499,17 @@ static int compare_super_imsm(struct supertype *st, struct supertype *tst)
                        dv->next = first->devlist;
                        first->devlist = dv;
                }
-               if (i <= sec->anchor->num_raid_devs) {
+               if (i < sec->anchor->num_raid_devs) {
                        /* allocation failure */
                        free_devlist(first);
                        fprintf(stderr, "imsm: failed to associate spare\n"); 
                        return 3;
                }
-               for (i = 0; i < sec->anchor->num_raid_devs; i++)
-                       imsm_copy_dev(get_imsm_dev(first, i), get_imsm_dev(sec, i));
-
                first->anchor->num_raid_devs = sec->anchor->num_raid_devs;
                first->anchor->orig_family_num = sec->anchor->orig_family_num;
                first->anchor->family_num = sec->anchor->family_num;
+               for (i = 0; i < sec->anchor->num_raid_devs; i++)
+                       imsm_copy_dev(get_imsm_dev(first, i), get_imsm_dev(sec, i));
        }
 
        return 0;