From: Dan Williams Date: Wed, 26 May 2010 20:33:43 +0000 (-0700) Subject: imsm: robustify recovery-start detection X-Git-Tag: mdadm-3.1.3~45^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4363fd80bcc9f85ed824228dee5e6350a8d73e18;p=thirdparty%2Fmdadm.git imsm: robustify recovery-start detection update_recovery_start() assumed that the out-of-sync disk would always be marked as IMSM_ORD_REBUILD in the disk_ord_tbl, but the segmentation fault reported by Andy proves otherwise. This might also be explained by an interrupted rebuild and the disk has not yet been marked missing. https://bugzilla.redhat.com/show_bug.cgi?id=592030 Reported-by: Andy Lutomirski Signed-off-by: Dan Williams --- diff --git a/super-intel.c b/super-intel.c index bdd7a968..dd9699de 100644 --- a/super-intel.c +++ b/super-intel.c @@ -4044,6 +4044,15 @@ static void update_recovery_start(struct imsm_dev *dev, struct mdinfo *array) rebuild = d; } + if (!rebuild) { + /* (?) none of the disks are marked with + * IMSM_ORD_REBUILD, so assume they are missing and the + * disk_ord_tbl was not correctly updated + */ + dprintf("%s: failed to locate out-of-sync disk\n", __func__); + return; + } + units = __le32_to_cpu(dev->vol.curr_migr_unit); rebuild->recovery_start = units * blocks_per_migr_unit(dev); }