diff options
author | Dan Williams <dan.j.williams@intel.com> | 2009-09-15 11:34:20 -0700 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2009-09-15 11:34:20 -0700 |
commit | 436305c6905f81735eb04e9ef6577c21358836e8 (patch) | |
tree | c9845253bfb5db4eea3b72a35124dba26532e271 /Detail.c | |
parent | ee836c39b503e67b895a7ebabee8208a7ff0fea8 (diff) | |
download | mdadm-436305c6905f81735eb04e9ef6577c21358836e8.tar.gz mdadm-436305c6905f81735eb04e9ef6577c21358836e8.tar.xz mdadm-436305c6905f81735eb04e9ef6577c21358836e8.zip |
Detail: fix for an imsm container with a spare
Spares for imsm arrays do not have any info about the container in their
metadata records. If Detail() inadvertantly picks such a device for
->get_array_info() it will end up with less than useful info for the
container. So, continue to read from the disks until a non-spare device
is found.
This bug was found by timeouts waiting for udev to create the
user-friendly container name. To detect future UUID reporting problems
and a debug print to the timeout case in wait_for().
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'Detail.c')
-rw-r--r-- | Detail.c | 15 |
1 files changed, 14 insertions, 1 deletions
@@ -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<<MD_DISK_ACTIVE)))) { /* try to read the superblock from this device * to get more info */ + if (free_spare) + st->ss->free_super(st); int fd2 = dev_open(dv, O_RDONLY); if (fd2 >=0 && st && st->ss->load_super(st, fd2, NULL) == 0) { |