verbose-quiet, force);
}
} else {
- mddev_ident_t array_list = conf_get_ident(NULL);
+ mddev_ident_t a, array_list = conf_get_ident(NULL);
mddev_dev_t devlist = conf_get_devs();
int cnt = 0;
+ int failures, successes;
if (devlist == NULL) {
fprintf(stderr, Name ": No devices listed in conf file were found.\n");
exit(1);
fprintf(stderr, Name ": --backup_file not meaningful with a --scan assembly.\n");
exit(1);
}
- for (; array_list; array_list = array_list->next) {
- if (array_list->devname &&
- strcasecmp(array_list->devname, "<ignore>") == 0)
- continue;
- if (array_list->autof == 0)
- array_list->autof = autof;
+ for (a = array_list; a ; a = a->next) {
+ a->assembled = 0;
+ if (a->autof == 0)
+ a->autof = autof;
+ }
+ do {
+ failures = 0;
+ successes = 0;
+ rv = 0;
+ for (a = array_list; a ; a = a->next) {
+ int r;
+ if (a->assembled)
+ continue;
+ if (a->devname &&
+ strcasecmp(a->devname, "<ignore>") == 0)
+ continue;
- rv |= Assemble(ss, array_list->devname,
- array_list,
- NULL, NULL,
- readonly, runstop, NULL,
- homehost, require_homehost,
- verbose-quiet, force);
- cnt++;
- }
+ r = Assemble(ss, a->devname,
+ a,
+ NULL, NULL,
+ readonly, runstop, NULL,
+ homehost, require_homehost,
+ verbose-quiet, force);
+ if (r == 0) {
+ a->assembled = 1;
+ successes++;
+ } else
+ failures++;
+ rv |= r;
+ cnt++;
+ }
+ } while (failures && successes);
if (homehost && cnt == 0) {
/* Maybe we can auto-assemble something.
* Repeatedly call Assemble in auto-assemble mode
char *member; /* subarray within a container */
struct mddev_ident_s *next;
+ union {
+ /* fields needed by different users of this structure */
+ int assembled; /* set when assembly succeeds */
+ };
} *mddev_ident_t;
/* List of device names - wildcards expanded */