X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=blobdiff_plain;f=Assemble.c;h=a73e101ed047e75c139ab48b84a70f0c15270df2;hp=1f41369a8512acb5bf1d18748337d184f1ba343b;hb=ff54de6e47163944185f231700e72d3122b58f4c;hpb=7801ac209240ca5d5159d2ab990dd8d5573e2195 diff --git a/Assemble.c b/Assemble.c index 1f41369a..a73e101e 100644 --- a/Assemble.c +++ b/Assemble.c @@ -139,6 +139,9 @@ int Assemble(struct supertype *st, char *mddev, int mdfd, struct mdinfo info; char *avail; int nextspare = 0; + int uuid_for_name = 0; + + memset(&info, 0, sizeof(info)); if (get_linux_version() < 2004000) old_linux = 1; @@ -294,15 +297,28 @@ int Assemble(struct supertype *st, char *mddev, int mdfd, if (mdfd < 0) { if (tst == NULL || tst->sb == NULL) continue; - if (update == NULL && - tst->ss->match_home(tst, homehost)==0) { + switch(tst->ss->match_home(tst, homehost)) + { + case 1: /* happy with match. */ + break; + case -1: /* cannot match */ + uuid_for_name = 1; + break; + case 0: /* Doesn't match */ + if (update) + /* We are changing the name*/ + break; if ((inargv && verbose >= 0) || verbose > 0) - fprintf(stderr, Name ": %s is not built for host %s.\n", + fprintf(stderr, Name ": %s is not built for " + "host %s - using UUID for " + "device name.\n", devname, homehost); + /* Auto-assemble, and this is not a usable host */ /* if update != NULL, we are updating the host * name... */ - goto loop; + uuid_for_name = 1; + break; } } /* If we are this far, then we are nearly commited to this device. @@ -337,7 +353,8 @@ int Assemble(struct supertype *st, char *mddev, int mdfd, if (homehost) { int first = st->ss->match_home(st, homehost); int last = tst->ss->match_home(tst, homehost); - if (first+last == 1) { + if (first != last && + (first == 1 || last == 1)) { /* We can do something */ if (first) {/* just ignore this one */ if ((inargv && verbose >= 0) || verbose > 0) @@ -378,12 +395,17 @@ int Assemble(struct supertype *st, char *mddev, int mdfd, */ mdu_array_info_t inf; char *c; + char nbuf[64]; if (!st || !st->sb) { return 2; } st->ss->getinfo_super(st, &info); - c = strchr(info.name, ':'); - if (c) c++; else c= info.name; + if (uuid_for_name) + c = fname_from_uuid(st, &info, nbuf, '-'); + else { + c = strchr(info.name, ':'); + if (c) c++; else c= info.name; + } if (isdigit(*c) && ((ident->autof & 7)==4 || (ident->autof&7)==6)) /* /dev/md/d0 style for partitionable */ asprintf(&mddev, "/dev/md/d%s", c); @@ -736,6 +758,9 @@ int Assemble(struct supertype *st, char *mddev, int mdfd, return 1; } st->ss->getinfo_super(st, &info); +#ifndef MDASSEMBLE + sysfs_init(&info, mdfd, 0); +#endif for (i=0; iss->external) { - char ver[100]; - strcat(strcpy(ver, "external:"), info.text_version); - sra = sysfs_read(mdfd, 0, 0); - if ((vers % 100) < 2 || - sra == NULL || - sysfs_set_str(sra, NULL, "metadata_version", - ver) < 0) { - fprintf(stderr, Name ": This kernel does not " - "support external metadata.\n"); - return 1; - } - rv = sysfs_set_array(sra, &info); - } else -#endif - if ((vers % 100) >= 1) { /* can use different versions */ - mdu_array_info_t inf; - memset(&inf, 0, sizeof(inf)); - inf.major_version = info.array.major_version; - inf.minor_version = info.array.minor_version; - rv = ioctl(mdfd, SET_ARRAY_INFO, &inf); - } else - rv = ioctl(mdfd, SET_ARRAY_INFO, NULL); - + rv = set_array_info(mdfd, st, &info); if (rv) { - fprintf(stderr, Name ": SET_ARRAY_INFO failed for %s: %s\n", + fprintf(stderr, Name ": failed to set array info for %s: %s\n", mddev, strerror(errno)); if (must_close) close(mdfd); return 1; @@ -913,7 +913,7 @@ int Assemble(struct supertype *st, char *mddev, int mdfd, j = chosen_drive; if (j >= 0 /* && devices[j].uptodate */) { - rv = add_disk(mdfd, st, sra, &devices[j].i); + rv = add_disk(mdfd, st, &info, &devices[j].i); if (rv) { fprintf(stderr, Name ": failed to add "