diff --git a/Detail.c b/Detail.c index ab01cfb..001012a 100644 --- a/Detail.c +++ b/Detail.c @@ -122,12 +122,25 @@ int Detail(char *dev, int brief, int export, int test, char *homehost) disk.minor == 0) continue; if ((dv=map_dev(disk.major, disk.minor, 1))) { - if ((!st || !st->sb) && + /* some formats (imsm) have free-floating-spares + * with a uuid of uuid_match_any, they don't + * have very good info about the rest of the + * container, so keep searching when + * encountering such a device. Otherwise, stop + * after the first successful call to + * ->load_super. + */ + int free_spare = memcmp(uuid_match_any, + info.uuid, + sizeof(uuid_match_any)) == 0; + if ((!st || !st->sb || free_spare) && (array.raid_disks == 0 || (disk.state & (1<ss->free_super(st); int fd2 = dev_open(dv, O_RDONLY); if (fd2 >=0 && st && st->ss->load_super(st, fd2, NULL) == 0) { diff --git a/util.c b/util.c index 2543971..4ccb1bb 100644 --- a/util.c +++ b/util.c @@ -863,6 +863,8 @@ void wait_for(char *dev, int fd) return; usleep(200000); } + if (i == 25) + dprintf("%s: timeout waiting for %s\n", __func__, dev); } struct superswitch *superlist[] = { &super0, &super1, &super_ddf, &super_imsm, NULL };