+ tmpdev->used = 1;
+
+ loop:
+ if (tmpdev->content)
+ goto next_member;
+ if (tst)
+ tst->ss->free_super(tst);
+ }
+
+ if (!st || !st->sb || !content)
+ return 2;
+
+ /* Now need to open array the device. Use create_mddev */
+ if (content == &info)
+ st->ss->getinfo_super(st, content);
+
+ trustworthy = FOREIGN;
+ switch (st->ss->match_home(st, homehost)) {
+ case 0:
+ trustworthy = FOREIGN;
+ name = content->name;
+ break;
+ case 1:
+ trustworthy = LOCAL;
+ name = strchr(content->name, ':');
+ if (name)
+ name++;
+ else
+ name = content->name;
+ break;
+ case -1:
+ trustworthy = FOREIGN;
+ break;
+ }
+ if (!auto_assem && trustworthy == FOREIGN)
+ /* If the array is listed in mdadm or on
+ * command line, then we trust the name
+ * even if the array doesn't look local
+ */
+ trustworthy = LOCAL;
+
+ if (content->name[0] == 0 &&
+ content->array.level == LEVEL_CONTAINER) {
+ name = content->text_version;
+ trustworthy = METADATA;
+ }
+ mdfd = create_mddev(mddev, name, ident->autof, trustworthy,
+ chosen_name);
+ if (mdfd < 0) {
+ st->ss->free_super(st);
+ free(devices);
+ if (auto_assem)
+ goto try_again;
+ return 1;
+ }
+ mddev = chosen_name;
+ vers = md_get_version(mdfd);
+ if (vers < 9000) {
+ fprintf(stderr, Name ": Assemble requires driver version 0.90.0 or later.\n"
+ " Upgrade your kernel or try --build\n");
+ close(mdfd);
+ return 1;
+ }
+ if (ioctl(mdfd, GET_ARRAY_INFO, &tmp_inf)==0) {
+ fprintf(stderr, Name ": %s already active, cannot restart it!\n",
+ mddev);
+ for (tmpdev = devlist ;
+ tmpdev && tmpdev->used != 1;
+ tmpdev = tmpdev->next)
+ ;
+ if (tmpdev && auto_assem)
+ fprintf(stderr, Name ": %s needed for %s...\n",
+ mddev, tmpdev->devname);
+ close(mdfd);
+ mdfd = -3;
+ st->ss->free_super(st);
+ free(devices);
+ if (auto_assem)
+ goto try_again;
+ return 1;
+ }
+ ioctl(mdfd, STOP_ARRAY, NULL); /* just incase it was started but has no content */
+
+#ifndef MDASSEMBLE
+ if (content != &info) {
+ /* This is a member of a container. Try starting the array. */
+ return assemble_container_content(st, mdfd, content, runstop,
+ chosen_name, verbose);
+ }
+#endif
+ /* Ok, no bad inconsistancy, we can try updating etc */
+ bitmap_done = 0;
+ for (tmpdev = devlist; tmpdev; tmpdev=tmpdev->next) if (tmpdev->used == 1) {
+ char *devname = tmpdev->devname;
+ struct stat stb;