]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - super-ddf.c
Assemble: print verbose messages when finding members in containers
[thirdparty/mdadm.git] / super-ddf.c
index 8153924e16fd33d001f96dc91e3135b65e06fbdf..06858e23fb9cbc3f0fc94874c2b9905d9a6ca73a 100644 (file)
@@ -1180,6 +1180,18 @@ static void getinfo_super_ddf(struct supertype *st, struct mdinfo *info);
 static void uuid_from_super_ddf(struct supertype *st, int uuid[4]);
 
 static void brief_examine_super_ddf(struct supertype *st, int verbose)
+{
+       /* We just write a generic DDF ARRAY entry
+        */
+       struct mdinfo info;
+       char nbuf[64];
+       getinfo_super_ddf(st, &info);
+       fname_from_uuid(st, &info, nbuf, ':');
+
+       printf("ARRAY metadata=ddf UUID=%s\n", nbuf + 5);
+}
+
+static void brief_examine_subarrays_ddf(struct supertype *st, int verbose)
 {
        /* We just write a generic DDF ARRAY entry
         */
@@ -1203,7 +1215,6 @@ static void brief_examine_super_ddf(struct supertype *st, int verbose)
                printf("ARRAY container=%s member=%d UUID=%s\n",
                       nbuf+5, i, nbuf1+5);
        }
-       printf("ARRAY metadata=ddf UUID=%s\n", nbuf + 5);
 }
 
 static void export_examine_super_ddf(struct supertype *st)
@@ -1512,17 +1523,6 @@ 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;
@@ -1589,13 +1589,8 @@ static int init_super_ddf(struct supertype *st,
        struct phys_disk *pd;
        struct virtual_disk *vd;
 
-       if (!info) {
-               st->sb = NULL;
-               return 0;
-       }
        if (st->sb)
-               return init_super_ddf_bvd(st, info, size, name, homehost,
-                                         uuid);
+               return init_super_ddf_bvd(st, info, size, name, homehost, uuid);
 
        if (posix_memalign((void**)&ddf, 512, sizeof(*ddf)) != 0) {
                fprintf(stderr, Name ": %s could not allocate superblock\n", __func__);
@@ -1604,6 +1599,12 @@ static int init_super_ddf(struct supertype *st,
        memset(ddf, 0, sizeof(*ddf));
        ddf->dlist = NULL; /* no physical disks yet */
        ddf->conflist = NULL; /* No virtual disks yet */
+       st->sb = ddf;
+
+       if (info == NULL) {
+               /* zeroing superblock */
+               return 0;
+       }
 
        /* At least 32MB *must* be reserved for the ddf.  So let's just
         * start 32MB from the end, and put the primary header there.
@@ -2362,15 +2363,19 @@ static int __write_init_super_ddf(struct supertype *st, int do_close)
 
 static int write_init_super_ddf(struct supertype *st)
 {
+       struct ddf_super *ddf = st->sb;
+       struct vcl *currentconf = ddf->currentconf;
+
+       /* we are done with currentconf reset it to point st at the container */
+       ddf->currentconf = NULL;
 
        if (st->update_tail) {
                /* queue the virtual_disk and vd_config as metadata updates */
                struct virtual_disk *vd;
                struct vd_config *vc;
-               struct ddf_super *ddf = st->sb;
                int len;
 
-               if (!ddf->currentconf) {
+               if (!currentconf) {
                        int len = (sizeof(struct phys_disk) +
                                   sizeof(struct phys_disk_entry));
 
@@ -2389,14 +2394,14 @@ static int write_init_super_ddf(struct supertype *st)
                len = sizeof(struct virtual_disk) + sizeof(struct virtual_entry);
                vd = malloc(len);
                *vd = *ddf->virt;
-               vd->entries[0] = ddf->virt->entries[ddf->currentconf->vcnum];
-               vd->populated_vdes = __cpu_to_be16(ddf->currentconf->vcnum);
+               vd->entries[0] = ddf->virt->entries[currentconf->vcnum];
+               vd->populated_vdes = __cpu_to_be16(currentconf->vcnum);
                append_metadata_update(st, vd, len);
 
                /* Then the vd_config */
                len = ddf->conf_rec_len * 512;
                vc = malloc(len);
-               memcpy(vc, &ddf->currentconf->conf, len);
+               memcpy(vc, &currentconf->conf, len);
                append_metadata_update(st, vc, len);
 
                /* FIXME I need to close the fds! */
@@ -2967,12 +2972,22 @@ static struct mdinfo *container_content_ddf(struct supertype *st)
        return rest;
 }
 
-static int store_zero_ddf(struct supertype *st, int fd)
+static int store_super_ddf(struct supertype *st, int fd)
 {
+       struct ddf_super *ddf = st->sb;
        unsigned long long dsize;
        void *buf;
        int rc;
 
+       if (!ddf)
+               return 1;
+
+       /* ->dlist and ->conflist will be set for updates, currently not
+        * supported
+        */
+       if (ddf->dlist || ddf->conflist)
+               return 1;
+
        if (!get_dev_size(fd, NULL, &dsize))
                return 1;
 
@@ -3604,6 +3619,7 @@ struct superswitch super_ddf = {
 #ifndef        MDASSEMBLE
        .examine_super  = examine_super_ddf,
        .brief_examine_super = brief_examine_super_ddf,
+       .brief_examine_subarrays = brief_examine_subarrays_ddf,
        .export_examine_super = export_examine_super_ddf,
        .detail_super   = detail_super_ddf,
        .brief_detail_super = brief_detail_super_ddf,
@@ -3622,7 +3638,7 @@ struct superswitch super_ddf = {
 
        .load_super     = load_super_ddf,
        .init_super     = init_super_ddf,
-       .store_super    = store_zero_ddf,
+       .store_super    = store_super_ddf,
        .free_super     = free_super_ddf,
        .match_metadata_desc = match_metadata_desc_ddf,
        .container_content = container_content_ddf,