From: Dan Williams Date: Thu, 15 May 2008 06:48:25 +0000 (+1000) Subject: Set 'metadata_version' for container_member in Incremental_container X-Git-Tag: devel~49 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5f2aace8eba3b4d9c82ed520d0fdf0f5d2b990e6;p=thirdparty%2Fmdadm.git Set 'metadata_version' for container_member in Incremental_container From: Dan Williams Signed-off-by: Dan Williams --- diff --git a/Incremental.c b/Incremental.c index 2e23677d..04e2e159 100644 --- a/Incremental.c +++ b/Incremental.c @@ -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 a17043a5..27f0f382 100644 --- 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; diff --git a/super-ddf.c b/super-ddf.c index 69ca3201..1031e22b 100644 --- a/super-ddf.c +++ b/super-ddf.c @@ -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++) {