]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - super-ddf.c
mdmon: allow incremental assembly of containers.
[thirdparty/mdadm.git] / super-ddf.c
index 7ca79fb778a7b9197ef69937ce086ec30f4c292a..6455deeee148cd1a9cbc01b2e3f37115f612dc39 100644 (file)
@@ -1189,6 +1189,18 @@ static void brief_examine_super_ddf(struct supertype *st)
        }
 }
 
+static void export_examine_super_ddf(struct supertype *st)
+{
+       struct mdinfo info;
+       char nbuf[64];
+       getinfo_super_ddf(st, &info);
+       fname_from_uuid(st, &info, nbuf, ':');
+       printf("MD_METADATA=ddf\n");
+       printf("MD_LEVEL=container\n");
+       printf("MD_UUID=%s\n", nbuf+5);
+}
+       
+
 static void detail_super_ddf(struct supertype *st, char *homehost)
 {
        /* FIXME later
@@ -1323,6 +1335,7 @@ static void getinfo_super_ddf(struct supertype *st, struct mdinfo *info)
                info->component_size = ddf->dlist->size - info->data_offset;
        } else {
                info->disk.number = -1;
+               info->disk.raid_disk = -1;
 //             info->disk.raid_disk = find refnum in the table and use index;
        }
        info->disk.state = (1 << MD_DISK_SYNC);
@@ -1481,10 +1494,20 @@ static int update_super_ddf(struct supertype *st, struct mdinfo *info,
        return rv;
 }
 
+__u32 random32(void)
+{
+       __u32 rv;
+       int rfd = open("/dev/urandom", O_RDONLY);
+       if (rfd < 0 || read(rfd, &rv, 4) != 4)
+               rv = random();
+       if (rfd >= 0)
+               close(rfd);
+       return rv;
+}
+
 static void make_header_guid(char *guid)
 {
        __u32 stamp;
-       int rfd;
        /* Create a DDF Header of Virtual Disk GUID */
 
        /* 24 bytes of fiction required.
@@ -1499,11 +1522,8 @@ static void make_header_guid(char *guid)
        memcpy(guid+12, &stamp, 4);
        stamp = __cpu_to_be32(time(0) - DECADE);
        memcpy(guid+16, &stamp, 4);
-       rfd = open("/dev/urandom", O_RDONLY);
-       if (rfd < 0 || read(rfd, &stamp, 4) != 4)
-               stamp = random();
+       stamp = random32();
        memcpy(guid+20, &stamp, 4);
-       if (rfd >= 0) close(rfd);
 }
 
 static int init_super_ddf_bvd(struct supertype *st,
@@ -2136,12 +2156,12 @@ static int add_to_super_ddf(struct supertype *st,
        tm = localtime(&now);
        sprintf(dd->disk.guid, "%8s%04d%02d%02d",
                T10, tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday);
-       *(__u32*)(dd->disk.guid + 16) = random();
-       *(__u32*)(dd->disk.guid + 20) = random();
+       *(__u32*)(dd->disk.guid + 16) = random32();
+       *(__u32*)(dd->disk.guid + 20) = random32();
 
        do {
                /* Cannot be bothered finding a CRC of some irrelevant details*/
-               dd->disk.refnum = random();
+               dd->disk.refnum = random32();
                for (i = __be16_to_cpu(ddf->active->max_pd_entries) - 1;
                     i >= 0; i--)
                        if (ddf->phys->entries[i].refnum == dd->disk.refnum)
@@ -2897,13 +2917,14 @@ static struct mdinfo *container_content_ddf(struct supertype *st)
                        if (vc->conf.phys_refnum[i] == 0xFFFFFFFF)
                                continue;
 
-                       this->array.working_disks++;
-
                        for (d = ddf->dlist; d ; d=d->next)
                                if (d->disk.refnum == vc->conf.phys_refnum[i])
                                        break;
                        if (d == NULL)
-                               break;
+                               /* Haven't found that one yet, maybe there are others */
+                               continue;
+
+                       this->array.working_disks++;
 
                        dev = malloc(sizeof(*dev));
                        memset(dev, 0, sizeof(*dev));
@@ -3563,6 +3584,7 @@ struct superswitch super_ddf = {
 #ifndef        MDASSEMBLE
        .examine_super  = examine_super_ddf,
        .brief_examine_super = brief_examine_super_ddf,
+       .export_examine_super = export_examine_super_ddf,
        .detail_super   = detail_super_ddf,
        .brief_detail_super = brief_detail_super_ddf,
        .validate_geometry = validate_geometry_ddf,