diff --git a/Incremental.c b/Incremental.c index d3f93a6..6ac67ac 100644 --- a/Incremental.c +++ b/Incremental.c @@ -412,8 +412,7 @@ int Incremental(char *devname, int verbose, int runstop, } /* 6/ Make sure /var/run/mdadm.map contains this array. */ map_update(&map, devnum, - info.array.major_version, - info.array.minor_version, + info.text_version, info.uuid, chosen_name); /* 7/ Is there enough devices to possibly start the array? */ @@ -647,8 +646,8 @@ void RebuildMap(void) path = map_dev(MD_MAJOR, md->devnum, 0); else path = map_dev(mdp, (-1-md->devnum)<< 6, 0); - map_add(&map, md->devnum, st->ss->major, - st->minor_version, + map_add(&map, md->devnum, + info.text_version, info.uuid, path ? : "/unknown"); st->ss->free_super(st); break; diff --git a/mapfile.c b/mapfile.c index 746073d..cf2ca2b 100644 --- a/mapfile.c +++ b/mapfile.c @@ -33,8 +33,8 @@ * also allows the array device name to be easily found. * * The map file is line based with space separated fields. The fields are: - * Device id - mdX or mdpX where is a number. - * metadata - 0.90 1.0 1.1 1.2 + * Device id - mdX or mdpX where X is a number. + * metadata - 0.90 1.0 1.1 1.2 ddf ... * UUID - uuid of the array * path - path where device created: /dev/md/home * @@ -62,7 +62,7 @@ int map_write(struct map_ent *mel) fprintf(f, "mdp%d ", -1-mel->devnum); else fprintf(f, "md%d ", mel->devnum); - fprintf(f, "%d.%d ", mel->major, mel->minor); + fprintf(f, "%s ", mel->metadata); fprintf(f, "%08x:%08x:%08x:%08x ", mel->uuid[0], mel->uuid[1], mel->uuid[2], mel->uuid[3]); fprintf(f, "%s\n", mel->path); @@ -87,13 +87,12 @@ int map_write(struct map_ent *mel) } void map_add(struct map_ent **melp, - int devnum, int major, int minor, int uuid[4], char *path) + int devnum, char *metadata, int uuid[4], char *path) { struct map_ent *me = malloc(sizeof(*me)); me->devnum = devnum; - me->major = major; - me->minor = minor; + strcpy(me->metadata, metadata); memcpy(me->uuid, uuid, 16); me->path = strdup(path); me->next = *melp; @@ -105,7 +104,8 @@ void map_read(struct map_ent **melp) FILE *f; char buf[8192]; char path[200]; - int devnum, major, minor, uuid[4]; + int devnum, uuid[4]; + char metadata[30]; char nam[4]; *melp = NULL; @@ -117,12 +117,12 @@ void map_read(struct map_ent **melp) return; while (fgets(buf, sizeof(buf), f)) { - if (sscanf(buf, " md%1[p]%d %d.%d %x:%x:%x:%x %200s", - nam, &devnum, &major, &minor, uuid, uuid+1, + if (sscanf(buf, " md%1[p]%d %s %x:%x:%x:%x %200s", + nam, &devnum, metadata, uuid, uuid+1, uuid+2, uuid+3, path) == 9) { if (nam[0] == 'p') devnum = -1 - devnum; - map_add(melp, devnum, major, minor, uuid, path); + map_add(melp, devnum, metadata, uuid, path); } } fclose(f); @@ -138,7 +138,7 @@ void map_free(struct map_ent *map) } } -int map_update(struct map_ent **mpp, int devnum, int major, int minor, +int map_update(struct map_ent **mpp, int devnum, char *metadata, int *uuid, char *path) { struct map_ent *map, *mp; @@ -151,15 +151,14 @@ int map_update(struct map_ent **mpp, int devnum, int major, int minor, for (mp = map ; mp ; mp=mp->next) if (mp->devnum == devnum) { - mp->major = major; - mp->minor = minor; + strcpy(mp->metadata, metadata); memcpy(mp->uuid, uuid, 16); free(mp->path); mp->path = strdup(path); break; } if (!mp) - map_add(&map, devnum, major, minor, uuid, path); + map_add(&map, devnum, metadata, uuid, path); *mpp = NULL; rv = map_write(map); map_free(map); diff --git a/mdadm.h b/mdadm.h index 75e66df..041e53d 100644 --- a/mdadm.h +++ b/mdadm.h @@ -301,11 +301,11 @@ extern int mddev_busy(int devnum); struct map_ent { struct map_ent *next; int devnum; - int major,minor; + char metadata[20]; int uuid[4]; char *path; }; -extern int map_update(struct map_ent **mpp, int devnum, int major, int minor, +extern int map_update(struct map_ent **mpp, int devnum, char *metadata, int uuid[4], char *path); extern struct map_ent *map_by_uuid(struct map_ent **map, int uuid[4]); extern void map_read(struct map_ent **melp); @@ -313,7 +313,7 @@ extern int map_write(struct map_ent *mel); extern void map_delete(struct map_ent **mapp, int devnum); extern void map_free(struct map_ent *map); extern void map_add(struct map_ent **melp, - int devnum, int major, int minor, int uuid[4], char *path); + int devnum, char *metadata, int uuid[4], char *path); /* various details can be requested */ #define GET_LEVEL 1 diff --git a/super0.c b/super0.c index e8cc3f3..47b95ec 100644 --- a/super0.c +++ b/super0.c @@ -369,6 +369,8 @@ static void getinfo_super0(struct supertype *st, struct mdinfo *info) info->events = md_event(sb); info->data_offset = 0; + sprintf(info->text_version, "0.%d", sb->minor_version); + uuid_from_super0(st, info->uuid); if (sb->minor_version > 90 && (sb->reshape_position+1) != 0) { diff --git a/super1.c b/super1.c index bebd5f9..d2d8d95 100644 --- a/super1.c +++ b/super1.c @@ -531,6 +531,7 @@ static void getinfo_super1(struct supertype *st, struct mdinfo *info) info->disk.raid_disk = role; } info->events = __le64_to_cpu(sb->events); + sprintf(info->text_version, "1.%d", st->minor_version); memcpy(info->uuid, sb->set_uuid, 16);