]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - super-intel.c
util: make env checking more generic
[thirdparty/mdadm.git] / super-intel.c
index babb098499478df6756a725009c513c0aec91546..f5ce06bdacb055f5373369d076e800eb8e7b983b 100644 (file)
@@ -213,17 +213,6 @@ struct imsm_update_add_disk {
        enum imsm_update_type type;
 };
 
-static int imsm_env_devname_as_serial(void)
-{
-       char *val = getenv("IMSM_DEVNAME_AS_SERIAL");
-
-       if (val && atoi(val) == 1)
-               return 1;
-
-       return 0;
-}
-
-
 static struct supertype *match_metadata_desc_imsm(char *arg)
 {
        struct supertype *st;
@@ -503,7 +492,7 @@ static void print_imsm_dev(struct imsm_dev *dev, int index)
        __u32 ord;
 
        printf("\n");
-       printf("[%s]:\n", dev->volume);
+       printf("[%.16s]:\n", dev->volume);
        printf("     RAID Level : %d\n", get_imsm_raid_level(map));
        printf("        Members : %d\n", map->num_members);
        for (slot = 0; slot < map->num_members; slot++)
@@ -622,10 +611,24 @@ static void brief_examine_super_imsm(struct supertype *st)
        /* We just write a generic IMSM ARRAY entry */
        struct mdinfo info;
        char nbuf[64];
+       struct intel_super *super = st->sb;
+       int i;
+
+       if (!super->anchor->num_raid_devs)
+               return;
 
        getinfo_super_imsm(st, &info);
        fname_from_uuid(st, &info, nbuf,'-');
        printf("ARRAY /dev/imsm 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, nbuf,'-');
+               printf("ARRAY /dev/md/%.16s container=/dev/imsm member=%d auto=mdp UUID=%s\n",
+                      dev->volume, i, nbuf + 5);
+       }
 }
 
 static void detail_super_imsm(struct supertype *st, char *homehost)
@@ -938,6 +941,24 @@ static int compare_super_imsm(struct supertype *st, struct supertype *tst)
         */
        if (first->anchor->num_raid_devs == 0 &&
            sec->anchor->num_raid_devs > 0) {
+               int i;
+
+               /* we need to copy raid device info from sec if an allocation
+                * fails here we don't associate the spare
+                */
+               for (i = 0; i < sec->anchor->num_raid_devs; i++) {
+                       first->dev_tbl[i] = malloc(sizeof(struct imsm_dev));
+                       if (!first->dev_tbl) {
+                               while (--i >= 0) {
+                                       free(first->dev_tbl[i]);
+                                       first->dev_tbl[i] = NULL;
+                               }
+                               fprintf(stderr, "imsm: failed to associate spare\n"); 
+                               return 3;
+                       }
+                       *first->dev_tbl[i] = *sec->dev_tbl[i];
+               }
+
                first->anchor->num_raid_devs = sec->anchor->num_raid_devs;
                first->anchor->family_num = sec->anchor->family_num;
        }
@@ -985,7 +1006,7 @@ static int imsm_read_serial(int fd, char *devname,
 
        rv = scsi_get_serial(fd, scsi_serial, sizeof(scsi_serial));
 
-       if (rv && imsm_env_devname_as_serial()) {
+       if (rv && check_env("IMSM_DEVNAME_AS_SERIAL")) {
                memset(serial, 0, MAX_RAID_SERIAL_LEN);
                fd2devname(fd, (char *) serial);
                return 0;
@@ -2451,7 +2472,8 @@ static __u8 imsm_check_degraded(struct intel_super *super, struct imsm_dev *dev,
                 * slot+1
                 */
                int i;
-               int insync;
+               /* gcc -Os complains that this is unused */
+               int insync = insync;
 
                for (i = 0; i < map->num_members; i++) {
                        __u32 ord = get_imsm_ord_tbl_ent(dev, i);