]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - super-intel.c
teach imsm and ddf what st->subarray means at load_super time
[thirdparty/mdadm.git] / super-intel.c
index 35c43f4e40a388560ff8b8fc660067a4a4a98d8a..24827d0b20261f865167e7dd62b5d457aea48564 100644 (file)
@@ -768,17 +768,16 @@ static void brief_examine_super_imsm(struct supertype *st, int verbose)
 
        getinfo_super_imsm(st, &info);
        fname_from_uuid(st, &info, nbuf, ':');
-       printf("ARRAY metadata=imsm auto=md UUID=%s\n", nbuf + 5);
        for (i = 0; i < super->anchor->num_raid_devs; i++) {
                struct imsm_dev *dev = get_imsm_dev(super, i);
 
                super->current_vol = i;
                getinfo_super_imsm(st, &info);
                fname_from_uuid(st, &info, nbuf1, ':');
-               printf("ARRAY /dev/md/%.16s container=%s\n"
-                      "   member=%d auto=mdp UUID=%s\n",
+               printf("ARRAY /dev/md/%.16s container=%s member=%d UUID=%s\n",
                       dev->volume, nbuf + 5, i, nbuf1 + 5);
        }
+       printf("ARRAY metadata=imsm UUID=%s\n", nbuf + 5);
 }
 
 static void export_examine_super_imsm(struct supertype *st)
@@ -2168,8 +2167,10 @@ static int load_super_imsm_all(struct supertype *st, int fd, void **sbp,
        if (st->subarray[0]) {
                if (atoi(st->subarray) <= super->anchor->num_raid_devs)
                        super->current_vol = atoi(st->subarray);
-               else
+               else {
+                       free_imsm(super);
                        return 1;
+               }
        }
 
        *sbp = super;
@@ -2194,8 +2195,6 @@ static int load_super_imsm(struct supertype *st, int fd, char *devname)
        if (load_super_imsm_all(st, fd, &st->sb, devname, 1) == 0)
                return 0;
 #endif
-       if (st->subarray[0])
-               return 1; /* FIXME */
 
        super = alloc_super(0);
        if (!super) {
@@ -2216,6 +2215,15 @@ static int load_super_imsm(struct supertype *st, int fd, char *devname)
                return rv;
        }
 
+       if (st->subarray[0]) {
+               if (atoi(st->subarray) <= super->anchor->num_raid_devs)
+                       super->current_vol = atoi(st->subarray);
+               else {
+                       free_imsm(super);
+                       return 1;
+               }
+       }
+
        st->sb = super;
        if (st->ss == NULL) {
                st->ss = &super_imsm;
@@ -3630,7 +3638,7 @@ static int mark_failure(struct imsm_dev *dev, struct imsm_disk *disk, int idx)
 
        disk->status |= FAILED_DISK;
        set_imsm_ord_tbl_ent(map, slot, idx | IMSM_ORD_REBUILD);
-       if (map->failed_disk_num == ~0)
+       if (~map->failed_disk_num == 0)
                map->failed_disk_num = slot;
        return 1;
 }