From: Dan Williams Date: Fri, 26 Aug 2011 02:14:09 +0000 (-0700) Subject: imsm: fix, stop metadata updates to newly failed devices X-Git-Tag: mdadm-3.2.3~179 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=86c54047e6685a4231e6b1eaff4c08bb84666d3a;p=thirdparty%2Fmdadm.git imsm: fix, stop metadata updates to newly failed devices We already refrain from updating metadata on disks that are failed at load, need to do the same for new failures. This also reverts b4add146 as we *do* want to update other disks' view of the failed device as out of date. Cc: Krzysztof Wojcik Signed-off-by: Dan Williams Signed-off-by: NeilBrown --- diff --git a/super-intel.c b/super-intel.c index a921cbc7..2f116980 100644 --- a/super-intel.c +++ b/super-intel.c @@ -4584,7 +4584,7 @@ static int write_super_imsm(struct supertype *st, int doclose) /* write the mpb for disks that compose raid devices */ for (d = super->disks; d ; d = d->next) { - if (d->index < 0) + if (d->index < 0 || is_failed(&d->disk)) continue; if (store_imsm_mpb(d->fd, mpb)) fprintf(stderr, "%s: failed for device %d:%d %s\n", @@ -5840,6 +5840,8 @@ static int mark_failure(struct imsm_dev *dev, struct imsm_disk *disk, int idx) __u32 ord; int slot; struct imsm_map *map; + char buf[MAX_RAID_SERIAL_LEN+3]; + unsigned int len, shift = 0; /* new failures are always set in map[0] */ map = get_imsm_map(dev, 0); @@ -5852,6 +5854,11 @@ static int mark_failure(struct imsm_dev *dev, struct imsm_disk *disk, int idx) if (is_failed(disk) && (ord & IMSM_ORD_REBUILD)) return 0; + sprintf(buf, "%s:0", disk->serial); + if ((len = strlen(buf)) >= MAX_RAID_SERIAL_LEN) + shift = len - MAX_RAID_SERIAL_LEN + 1; + strncpy((char *)disk->serial, &buf[shift], MAX_RAID_SERIAL_LEN); + disk->status |= FAILED_DISK; set_imsm_ord_tbl_ent(map, slot, idx | IMSM_ORD_REBUILD); if (map->failed_disk_num == 0xff)