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 <hdegoede@redhat.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
st->ss->export_detail_super(st);
} else {
struct map_ent *mp, *map = NULL;
st->ss->export_detail_super(st);
} else {
struct map_ent *mp, *map = NULL;
mp = map_by_devnum(&map, fd2devnum(fd));
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);
if (mp && mp->path &&
strncmp(mp->path, "/dev/md/", 8) == 0)
printf("MD_DEVNAME=%s\n", mp->path+8);
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 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);
extern char *fname_from_uuid(struct supertype *st,
struct mdinfo *info, char *buf, char sep);
extern unsigned long calc_csum(void *super, int bytes);
-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)
char uuid[16];
char *c = buf;
strcpy(c, "UUID-");
c += strlen(c);
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++) {
for (i = 0; i < 4; i++) {
if (i)
*c++ = sep;
for (j = 3; j >= 0; j--) {
if (i)
*c++ = sep;
for (j = 3; j >= 0; j--) {
+
+}
+
+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);