]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - super-intel.c
imsm: display member array uuid in examine_super_imsm
[thirdparty/mdadm.git] / super-intel.c
index d176dfd068601a28e104640fb320f7acc2c107c6..eca1de7e7f1d79b6acf31ec9f02d70ed3edb4991 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;
@@ -493,9 +482,7 @@ static __u32 imsm_reserved_sectors(struct intel_super *super, struct dl *dl)
 }
 
 #ifndef MDASSEMBLE
-static void getinfo_super_imsm(struct supertype *st, struct mdinfo *info);
-
-static void print_imsm_dev(struct imsm_dev *dev, int index)
+static void print_imsm_dev(struct imsm_dev *dev, char *uuid, int disk_idx)
 {
        __u64 sz;
        int slot;
@@ -503,11 +490,12 @@ 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("           UUID : %s\n", uuid);
        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++)
-               if (index == get_imsm_disk_idx(dev, slot))
+               if (disk_idx== get_imsm_disk_idx(dev, slot))
                        break;
        if (slot < map->num_members) {
                ord = get_imsm_ord_tbl_ent(dev, slot);
@@ -567,6 +555,8 @@ static void print_imsm_disk(struct imsm_super *mpb, int index, __u32 reserved)
               human_size(sz * 512));
 }
 
+static void getinfo_super_imsm(struct supertype *st, struct mdinfo *info);
+
 static void examine_super_imsm(struct supertype *st, char *homehost)
 {
        struct intel_super *super = st->sb;
@@ -606,8 +596,15 @@ static void examine_super_imsm(struct supertype *st, char *homehost)
                printf("   Spare Blocks : %d\n",  __le32_to_cpu(log->reserved_spare_block_count));
                printf("    First Spare : %llx\n", __le64_to_cpu(log->first_spare_lba));
        }
-       for (i = 0; i < mpb->num_raid_devs; i++)
-               print_imsm_dev(__get_imsm_dev(mpb, i), super->disks->index);
+       for (i = 0; i < mpb->num_raid_devs; i++) {
+               struct mdinfo info;
+               struct imsm_dev *dev = __get_imsm_dev(mpb, i);
+
+               super->current_vol = i;
+               getinfo_super_imsm(st, &info);
+               fname_from_uuid(st, &info, nbuf, '-');
+               print_imsm_dev(dev, nbuf + 5, super->disks->index);
+       }
        for (i = 0; i < mpb->num_disks; i++) {
                if (i == super->disks->index)
                        continue;
@@ -615,17 +612,31 @@ static void examine_super_imsm(struct supertype *st, char *homehost)
        }
 }
 
-static void getinfo_super_imsm(struct supertype *st, struct mdinfo *info);
-
 static void brief_examine_super_imsm(struct supertype *st)
 {
        /* We just write a generic IMSM ARRAY entry */
        struct mdinfo info;
        char nbuf[64];
+       char nbuf1[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);
+       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",
+                      dev->volume, nbuf + 5, i, nbuf1 + 5);
+       }
 }
 
 static void detail_super_imsm(struct supertype *st, char *homehost)
@@ -825,7 +836,11 @@ static void getinfo_super_imsm(struct supertype *st, struct mdinfo *info)
                info->disk.state |= s & FAILED_DISK ? (1 << MD_DISK_FAULTY) : 0;
                info->disk.state |= s & SPARE_DISK ? 0 : (1 << MD_DISK_SYNC);
        }
-       if (info->disk.state & (1 << MD_DISK_SYNC))
+
+       /* only call uuid_from_super_imsm when this disk is part of a populated container,
+        * ->compare_super may have updated the 'num_raid_devs' field for spares
+        */
+       if (info->disk.state & (1 << MD_DISK_SYNC) || super->anchor->num_raid_devs)
                uuid_from_super_imsm(st, info->uuid);
        else
                memcpy(info->uuid, uuid_match_any, sizeof(int[4]));
@@ -934,6 +949,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;
        }
@@ -981,7 +1014,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;
@@ -2447,7 +2480,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);