From: NeilBrown Date: Wed, 7 Mar 2012 04:25:57 +0000 (+1100) Subject: Manage: allow --re-add to failed array. X-Git-Tag: mdadm-3.2.4~69 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c69ffac0d6a068823a1365c3b155ff72f8c4686f;p=thirdparty%2Fmdadm.git Manage: allow --re-add to failed array. If both "legs" of a RAID1 (or equivalent in RAID10) fail, then one of the becomes available again it maybe appropriate to re-add the failed device(s). So remove the restriction that an array must has 'enough' devices before being re-added, and if there is no-where to read a superblock from for matching, then assume the kernel will do necessary checks. Signed-off-by: NeilBrown --- diff --git a/Manage.c b/Manage.c index d9775ded..4cf6e587 100644 --- a/Manage.c +++ b/Manage.c @@ -723,7 +723,13 @@ int Manage_subdevs(char *devname, int fd, break; } /* FIXME this is a bad test to be using */ - if (!tst->sb) { + if (!tst->sb && + dv->re_add) { + /* we are re-adding a device to a + * completely dead array - have to depend + * on kernel to check + */ + } else if (!tst->sb) { close(tfd); st->ss->free_super(st); fprintf(stderr, Name ": cannot load array metadata from %s\n", devname); @@ -747,12 +753,16 @@ int Manage_subdevs(char *devname, int fd, * and was temporarily removed, and is now being re-added. * If so, we can simply re-add it. */ - tst->ss->uuid_from_super(tst, duuid); if (st->sb) { struct mdinfo mdi; st->ss->getinfo_super(st, &mdi, NULL); st->ss->uuid_from_super(st, ouuid); + if (tst->sb) + tst->ss->uuid_from_super(tst, duuid); + else + /* Assume uuid matches: kernel will check */ + memcpy(duuid, ouuid, sizeof(ouuid)); if ((mdi.disk.state & (1<