/* Nothing new, don't try to start */ ;
else if (runstop > 0 ||
(working + preexist) >= content->array.working_disks) {
+
+ map_update(&map, fd2devnum(mdfd),
+ content->text_version,
+ content->uuid, chosen_name);
switch(content->array.level) {
case LEVEL_LINEAR:
case LEVEL_MULTIPATH:
fprintf(stderr, " (%d new)", working);
fprintf(stderr, "\n");
}
+ wait_for(chosen_name);
/* FIXME should have an O_EXCL and wait for read-auto */
} else
if (verbose >= 0)
": %s assembled with %d devices but "
"not started\n",
chosen_name, working);
- map_update(&map, fd2devnum(mdfd),
- content->text_version,
- content->uuid, chosen_name);
return 0;
}
map_unlock(&map);
return 1;
}
+ mddev = chosen_name;
map_update(&map, fd2devnum(mdfd), "none", uuid, chosen_name);
map_unlock(&map);
fprintf(stderr, Name ": array %s built and started.\n",
mddev);
close(mdfd);
+ wait_for(mddev);
return 0;
abort:
fprintf(stderr, Name ": not starting array - not enough devices.\n");
}
close(mdfd);
+ wait_for(chosen_name);
return 0;
abort:
fprintf(stderr, Name
": container %s now has %d devices\n",
chosen_name, info.array.working_disks);
+ wait_for(chosen_name);
return Incremental(chosen_name, verbose, runstop,
NULL, homehost, autof);
}
": %s attached to %s, which has been started.\n",
devname, chosen_name);
rv = 0;
+ wait_for(chosen_name);
} else {
fprintf(stderr, Name
": %s attached to %s, but failed to start: %s.\n",
extern int get_dev_size(int fd, char *dname, unsigned long long *sizep);
extern void get_one_disk(int mdfd, mdu_array_info_t *ainf,
mdu_disk_info_t *disk);
+void wait_for(char *dev);
#if __GNUC__ < 3
struct stat64;
return st1.st_rdev == st2.st_rdev;
}
+void wait_for(char *dev)
+{
+ int i;
+
+ for (i=0 ; i<25 ; i++) {
+ struct stat stb;
+ if (stat(dev, &stb) == 0)
+ return;
+ usleep(200000);
+ }
+}
+
struct superswitch *superlist[] = { &super0, &super1, &super_ddf, &super_imsm, NULL };
#if !defined(MDASSEMBLE) || defined(MDASSEMBLE) && defined(MDASSEMBLE_AUTO)