From: Dan Williams Date: Wed, 14 Oct 2009 00:41:57 +0000 (-0700) Subject: Detail: export MD_UUID from mapfile X-Git-Tag: mdadm-3.0.3~15^2~3 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=commitdiff_plain;h=aae5a11207cf6da1682e6a76e116a19e21473f03;hp=d2b9eb5993b6c36bf1d66980811bda1b6eefb19f Detail: export MD_UUID from mapfile The load_super() from an mdadm --detail call may race against an mdmon update. When this happens the load_super sees an inconsistent metadata block and returns an error. The fallback path to use the map file contents lacks uuid reporting, so provide __fname_from_uuid for generically printing a uuid. Reported-by: Hans de Goede Signed-off-by: Dan Williams --- diff --git a/Detail.c b/Detail.c index 001012a2..1598a425 100644 --- a/Detail.c +++ b/Detail.c @@ -194,7 +194,12 @@ int Detail(char *dev, int brief, int export, int test, char *homehost) st->ss->export_detail_super(st); } else { struct map_ent *mp, *map = NULL; + char nbuf[64]; mp = map_by_devnum(&map, fd2devnum(fd)); + if (mp) { + __fname_from_uuid(mp->uuid, 0, nbuf, ':'); + printf("MD_UUID=%s\n", nbuf+5); + } if (mp && mp->path && strncmp(mp->path, "/dev/md/", 8) == 0) printf("MD_DEVNAME=%s\n", mp->path+8); diff --git a/mdadm.h b/mdadm.h index 04b87b82..8212a2c4 100644 --- a/mdadm.h +++ b/mdadm.h @@ -810,6 +810,7 @@ extern void uuid_from_super(int uuid[4], mdp_super_t *super); extern const int uuid_match_any[4]; extern int same_uuid(int a[4], int b[4], int swapuuid); extern void copy_uuid(void *a, int b[4], int swapuuid); +extern char *__fname_from_uuid(int id[4], int swap, char *buf, char sep); extern char *fname_from_uuid(struct supertype *st, struct mdinfo *info, char *buf, char sep); extern unsigned long calc_csum(void *super, int bytes); diff --git a/util.c b/util.c index 4ccb1bbf..98aedd08 100644 --- a/util.c +++ b/util.c @@ -269,17 +269,15 @@ void copy_uuid(void *a, int b[4], int swapuuid) memcpy(a, b, 16); } -char *fname_from_uuid(struct supertype *st, struct mdinfo *info, char *buf, char sep) +char *__fname_from_uuid(int id[4], int swap, char *buf, char sep) { int i, j; - int id; char uuid[16]; char *c = buf; strcpy(c, "UUID-"); c += strlen(c); - copy_uuid(uuid, info->uuid, st->ss->swapuuid); + copy_uuid(uuid, id, swap); for (i = 0; i < 4; i++) { - id = uuid[i]; if (i) *c++ = sep; for (j = 3; j >= 0; j--) { @@ -288,6 +286,12 @@ char *fname_from_uuid(struct supertype *st, struct mdinfo *info, char *buf, char } } return buf; + +} + +char *fname_from_uuid(struct supertype *st, struct mdinfo *info, char *buf, char sep) +{ + return __fname_from_uuid(info->uuid, st->ss->swapuuid, buf, sep); } #ifndef MDASSEMBLE