- for (; array_list; array_list = array_list->next) {
- mdu_array_info_t array;
- mdfd = open_mddev(array_list->devname,
- array_list->autof ? array_list->autof : autof);
- if (mdfd < 0) {
- rv |= 1;
- continue;
- }
- if (ioctl(mdfd, GET_ARRAY_INFO, &array)>=0)
- /* already assembled, skip */
- ;
- else
- rv |= Assemble(ss, array_list->devname, mdfd,
- array_list, configfile,
- NULL, NULL,
- readonly, runstop, NULL, verbose-quiet, force);
- close(mdfd);
+ close(mdfd);
+ }
+ if (homehost) {
+ /* Maybe we can auto-assemble something.
+ * Repeatedly call Assemble in auto-assmble mode
+ * until it fails
+ */
+ int rv2;
+ int acnt;
+ ident.autof = autof;
+ do {
+ mddev_dev_t devlist = conf_get_devs();
+ acnt = 0;
+ do {
+ rv2 = Assemble(ss, NULL, -1,
+ &ident,
+ devlist, NULL,
+ readonly, runstop, NULL, homehost, verbose-quiet, force);
+ if (rv2==0) {
+ cnt++;
+ acnt++;
+ }
+ if (rv2 == 1)
+ /* found something so even though assembly failed we
+ * want to avoid auto-updates
+ */
+ auto_update_home = 0;
+ } while (rv2!=2);
+ /* Incase there are stacked devices, we need to go around again */
+ } while (acnt);
+ if (cnt == 0 && auto_update_home && homehost) {
+ /* Nothing found, maybe we need to bootstrap homehost info */
+ do {
+ acnt = 0;
+ do {
+ rv2 = Assemble(ss, NULL, -1,
+ &ident,
+ NULL, NULL,
+ readonly, runstop, "homehost", homehost, verbose-quiet, force);
+ if (rv2==0) {
+ cnt++;
+ acnt++;
+ }
+ } while (rv2!=2);
+ /* Incase there are stacked devices, we need to go around again */
+ } while (acnt);