From e9d82038f800b699a43465410f25189975c5d63e Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Thu, 24 Jul 2008 17:26:23 -0700 Subject: [PATCH] imsm: allow --examine to succeed with damaged metadata limp along after seeing mismatched serial numbers Signed-off-by: Dan Williams --- super-intel.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) 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; -- 2.39.2