From: Dan Williams Date: Fri, 25 Jul 2008 00:26:23 +0000 (-0700) Subject: imsm: allow --examine to succeed with damaged metadata X-Git-Tag: mdadm-3.0-devel1~85 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e9d82038f800b699a43465410f25189975c5d63e;p=thirdparty%2Fmdadm.git imsm: allow --examine to succeed with damaged metadata limp along after seeing mismatched serial numbers Signed-off-by: Dan Williams --- diff --git a/super-intel.c b/super-intel.c index 618baf68..dcd5de31 100644 --- a/super-intel.c +++ b/super-intel.c @@ -373,6 +373,9 @@ static void print_imsm_disk(struct imsm_super *mpb, int index) __u32 s; __u64 sz; + if (index < 0) + return; + printf("\n"); snprintf(str, MAX_RAID_SERIAL_LEN, "%s", disk->serial); printf(" Disk%02d Serial : %s\n", index, str); @@ -550,6 +553,11 @@ static void getinfo_super_imsm(struct supertype *st, struct mdinfo *info) if (super->disks) { disk = get_imsm_disk(mpb, super->disks->index); + if (!disk) { + info->disk.number = -1; + info->disk.raid_disk = -1; + return; + } info->disk.number = super->disks->index; info->disk.raid_disk = super->disks->index; info->data_offset = __le32_to_cpu(disk->total_blocks) - @@ -747,8 +755,13 @@ load_imsm_disk(int fd, struct intel_super *super, char *devname, int keep_fd) break; } - if (i > mpb->num_disks) - return 2; + if (i > mpb->num_disks - 1) { + if (devname) + fprintf(stderr, + Name ": failed to match serial \'%s\' for %s\n", + dl->serial, devname); + return 0; + } dl->index = i;