]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
imsm: load migration record from right disk
authorTomasz Majchrzak <tomasz.majchrzak@intel.com>
Mon, 24 Oct 2016 10:00:17 +0000 (12:00 +0200)
committerJes Sorensen <Jes.Sorensen@redhat.com>
Wed, 26 Oct 2016 16:00:46 +0000 (12:00 -0400)
Migration record is only stored on disks in first and second metadata
slot. The function to load the record incorrectly passes disk slot as
disk index. If rebuilt has taken place for a container, disk slot
doesn't match disk index so it causes migration record to be read from a
disk it has not been written to. As a result reshape operation fails.

Signed-off-by: Tomasz Majchrzak <tomasz.majchrzak@intel.com>
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
super-intel.c

index f52e3d4df45a9dbd255473b55f6c1ba52915a9af..e501b6fd30ed682c22c17467ab9cd7f2fcade3f8 100644 (file)
@@ -2477,19 +2477,12 @@ static int load_imsm_migr_rec(struct intel_super *super, struct mdinfo *info)
        */
        if (dev == NULL)
                return -2;
-       map = get_imsm_map(dev, MAP_0);
 
        if (info) {
                for (sd = info->devs ; sd ; sd = sd->next) {
-                       /* skip spare and failed disks
-                        */
-                       if (sd->disk.raid_disk < 0)
-                               continue;
                        /* read only from one of the first two slots */
-                       if (map)
-                               slot = get_imsm_disk_slot(map,
-                                                         sd->disk.raid_disk);
-                       if (map == NULL || slot > 1 || slot < 0)
+                       if ((sd->disk.raid_disk < 0) ||
+                           (sd->disk.raid_disk > 1))
                                continue;
 
                        sprintf(nm, "%d:%d", sd->disk.major, sd->disk.minor);
@@ -2499,6 +2492,7 @@ static int load_imsm_migr_rec(struct intel_super *super, struct mdinfo *info)
                }
        }
        if (fd < 0) {
+               map = get_imsm_map(dev, MAP_0);
                for (dl = super->disks; dl; dl = dl->next) {
                        /* skip spare and failed disks
                        */