]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Set 'metadata_version' for container_member in Incremental_container
authorDan Williams <dan.j.williams@intel.com>
Thu, 15 May 2008 06:48:25 +0000 (16:48 +1000)
committerNeil Brown <neilb@suse.de>
Thu, 15 May 2008 06:48:25 +0000 (16:48 +1000)
From: Dan Williams <dan.j.williams@intel.com>

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Incremental.c
mdadm.h
super-ddf.c

index 2e23677dc88820c4229b0ee561ce9f385a18c051..04e2e159555481c71ea0c6d1579aff042320d9de 100644 (file)
@@ -717,6 +717,19 @@ int IncrementalScan(int verbose)
        return rv;
 }
 
+static char *container2devname(char *devname)
+{
+       int fd = open(devname, O_RDONLY);
+       char *mdname = NULL;
+
+       if (fd > 0) {
+               mdname = devnum2devname(fd2devnum(fd));
+               close(fd);
+       }
+
+       return mdname;
+}
+
 int Incremental_container(struct supertype *st, char *devname, int verbose,
                          int runstop, int autof)
 {
@@ -726,6 +739,12 @@ int Incremental_container(struct supertype *st, char *devname, int verbose,
 
        struct mdinfo *list = st->ss->container_content(st);
        struct mdinfo *ra;
+       char *mdname = container2devname(devname);
+
+       if (!mdname) {
+               fprintf(stderr, Name": failed to determine device name\n");
+               return 2;
+       }
 
        for (ra = list ; ra ; ra = ra->next) {
                struct mdinfo *sra;
@@ -736,6 +755,7 @@ int Incremental_container(struct supertype *st, char *devname, int verbose,
                int usepart = 1;
                char *n;
                int working = 0;
+               char ver[100];
 
                if ((autof&7) == 3 || (autof&7) == 5)
                        usepart = 0;
@@ -769,6 +789,9 @@ int Incremental_container(struct supertype *st, char *devname, int verbose,
 
                sra = sysfs_read(mdfd, 0, 0);
 
+               sprintf(ver, "external:/%s/%d", mdname, ra->container_member);
+               sysfs_set_str(sra, NULL, "metadata_version", ver);
+
                sysfs_set_array(sra, ra);
                for (dev = ra->devs; dev; dev = dev->next) {
                        char buf[20];
diff --git a/mdadm.h b/mdadm.h
index a17043a56c6c2b9bf18314c962291f81b009acd8..27f0f3820b6962ce6dfc65d39bd6f58740c56b56 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -152,6 +152,7 @@ struct mdinfo {
        int                     cache_size; /* size of raid456 stripe cache*/
        int                     mismatch_cnt;
        char                    text_version[50];
+       int container_member; /* for assembling external-metatdata arrays */
 
        char            sys_name[20];
        struct mdinfo *devs;
index 69ca320142033696b222472b3ea1c89d2239a99f..1031e22b6c2622fd20c72e8ba1ec73a6be43cc9f 100644 (file)
@@ -2354,6 +2354,7 @@ static struct mdinfo *container_content_ddf(struct supertype *st)
                memset(this->uuid, 0, sizeof(this->uuid));
                this->component_size = __be64_to_cpu(vc->conf.blocks);
                this->array.size = this->component_size / 2;
+               this->container_member = i;
 
                mppe = __be16_to_cpu(ddf->anchor.max_primary_element_entries);
                for (i=0 ; i < mppe ; i++) {