From dd15dc4a4d56d0b9ed29b558fb86a8945a18bc5c Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Tue, 27 May 2008 09:18:56 +1000 Subject: [PATCH] Discard st->container_member 'container_member' isn't really a well defined concept. Each metadata might enumerate members differently, so just let each format /mdX/YYYY as appropriate. --- Create.c | 12 ++++-------- Incremental.c | 2 +- mdadm.h | 6 ++++-- super-ddf.c | 6 +++--- 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/Create.c b/Create.c index b7f0914..68a4230 100644 --- a/Create.c +++ b/Create.c @@ -541,15 +541,11 @@ int Create(struct supertype *st, char *mddev, int mdfd, if (st->ss->external) { char ver[100]; - if (st->ss->external == 1) - /* container */ - strcat(strcpy(ver, "external:"), - info.text_version); - else { + strcat(strcpy(ver, "external:"), + info.text_version); + if (st->ss->external == 2) { /* member */ - sprintf(ver, "external:/%s/%d", - devnum2devname(st->container_dev), - st->container_member); + /* When creating a member, we need to be careful * to negotiate with mdmon properly. * If it is already running, we cannot write to diff --git a/Incremental.c b/Incremental.c index 5c582bb..d3f93a6 100644 --- a/Incremental.c +++ b/Incremental.c @@ -830,7 +830,7 @@ 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); + sprintf(ver, "external:%s", ra->text_version); sysfs_set_str(sra, NULL, "metadata_version", ver); sysfs_set_array(sra, ra); diff --git a/mdadm.h b/mdadm.h index 73f22ae..f795b4a 100644 --- a/mdadm.h +++ b/mdadm.h @@ -154,7 +154,10 @@ 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 */ + + int container_member; /* for assembling external-metatdata arrays + * This is to be used internally by metadata + * handler only */ char sys_name[20]; struct mdinfo *devs; @@ -444,7 +447,6 @@ struct supertype { int minor_version; int max_devs; int container_dev; /* devnum of container */ - int container_member; /* numerical position in container */ void *sb; void *info; diff --git a/super-ddf.c b/super-ddf.c index fe76509..e8082b5 100644 --- a/super-ddf.c +++ b/super-ddf.c @@ -405,6 +405,7 @@ struct ddf_super { * the lba table */ struct vd_config conf; } *conflist, *newconf; + int conf_num; /* Index into 'virt' of entry matching 'newconf' */ struct dl { struct dl *next; struct disk_data disk; @@ -1162,7 +1163,7 @@ static void uuid_from_super_ddf(struct supertype *st, int uuid[4]) * The first 16 bytes of the sha1 of these is used. */ struct ddf_super *ddf = st->sb; - struct vd_config *vd = find_vdcr(ddf, st->container_member); + struct vd_config *vd = find_vdcr(ddf, ddf->conf_num); if (!vd) memset(uuid, 0, sizeof (uuid)); @@ -1688,7 +1689,7 @@ static int init_super_ddf_bvd(struct supertype *st, return 0; } ve = &ddf->virt->entries[venum]; - st->container_member = venum; + ddf->conf_num = venum; /* A Virtual Disk GUID contains the T10 Vendor ID, controller type, * timestamp, random number @@ -2086,7 +2087,6 @@ int validate_geometry_ddf(struct supertype *st, if (load_super_ddf_all(st, cfd, (void **)&ddf, NULL, 1) == 0) { st->sb = ddf; st->container_dev = fd2devnum(cfd); - st->container_member = 27; // FIXME close(cfd); return st->ss->validate_geometry(st, level, layout, raiddisks, chunk, size,