]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - super-intel.c
imsm: FIX: Restore critical section on degraded array
[thirdparty/mdadm.git] / super-intel.c
index 5827d13993e533372d41f57e987d6cd38df72855..9cea2672eaa548a69dccd85ce85fc2424a464310 100644 (file)
@@ -2313,8 +2313,7 @@ static void getinfo_super_imsm_volume(struct supertype *st, struct mdinfo *info,
        info->custom_array_size   |= __le32_to_cpu(dev->size_low);
        info->recovery_blocked = imsm_reshape_blocks_arrays_changes(st->sb);
 
-       if (prev_map && map->map_state == prev_map->map_state &&
-           (migr_type(dev) == MIGR_GEN_MIGR)) {
+       if (is_gen_migration(dev)) {
                info->reshape_active = 1;
                info->new_level = get_imsm_raid_level(map);
                info->new_layout = imsm_level_to_layout(info->new_level);
@@ -7984,6 +7983,10 @@ static void imsm_delete(struct intel_super *super, struct dl **dlp, unsigned ind
 int open_backup_targets(struct mdinfo *info, int raid_disks, int *raid_fds)
 {
        struct mdinfo *sd;
+       int i;
+
+       for (i = 0; i < raid_disks; i++)
+               raid_fds[i] = -1;
 
        for (sd = info->devs ; sd ; sd = sd->next) {
                char *dn;
@@ -8293,7 +8296,11 @@ int recover_backup_imsm(struct supertype *st, struct mdinfo *info)
        if (!targets)
                goto abort;
 
-       open_backup_targets(info, new_disks, targets);
+       if (open_backup_targets(info, new_disks, targets)) {
+               fprintf(stderr,
+                       Name ": Cannot open some devices belonging to array.\n");
+               goto abort;
+       }
 
        for (i = 0; i < new_disks; i++) {
                if (targets[i] < 0) {