X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=Assemble.c;h=3c00c9116cbd19d5f9f8b29e0aac8b40b1c022a1;hb=8aec876d2ee877ea86a67461237c2a8f5a43a5ab;hp=cb97f8cd59a491684d6531318aaae0aecad6ab5e;hpb=9fca7d6236e9775d0269b9802f740c08db46f4d7;p=thirdparty%2Fmdadm.git diff --git a/Assemble.c b/Assemble.c index cb97f8cd..3c00c911 100644 --- a/Assemble.c +++ b/Assemble.c @@ -51,7 +51,7 @@ static int name_matches(char *found, char *required, char *homehost) } int Assemble(struct supertype *st, char *mddev, int mdfd, - mddev_ident_t ident, char *conffile, + mddev_ident_t ident, mddev_dev_t devlist, char *backup_file, int readonly, int runstop, char *update, char *homehost, @@ -181,7 +181,7 @@ int Assemble(struct supertype *st, char *mddev, int mdfd, return 1; } if (devlist == NULL) - devlist = conf_get_devs(conffile); + devlist = conf_get_devs(); else if (mdfd >= 0) inargv = 1; @@ -499,6 +499,10 @@ int Assemble(struct supertype *st, char *mddev, int mdfd, if (nextspare < info.array.raid_disks) nextspare = info.array.raid_disks; i = nextspare++; + } else { + if (i >= info.array.raid_disks && + i >= nextspare) + nextspare = i+1; } if (i < 10000) { if (i >= bestcnt) { @@ -514,6 +518,25 @@ int Assemble(struct supertype *st, char *mddev, int mdfd, best = newbest; bestcnt = newbestcnt; } + if (best[i] >=0 && + devices[best[i]].events == devices[devcnt].events && + devices[best[i]].minor != devices[devcnt].minor && + st->ss->major == 0 && + info.array.level != -4) { + /* two different devices with identical superblock. + * Could be a mis-detection caused by overlapping + * partitions. fail-safe. + */ + fprintf(stderr, Name ": WARNING %s and %s appear" + " to have very similar superblocks.\n" + " If they are really different, " + "please --zero the superblock on one\n" + " If they are the same, please remove " + "one from the list.\n", + devices[best[i]].devname, devname); + if (must_close) close(mdfd); + return 1; + } if (best[i] == -1 || devices[best[i]].events < devices[devcnt].events) best[i] = devcnt;