int rv;
int bitmap_fd;
int have_container = 0;
- int container_fd;
+ int container_fd = -1;
int need_mdmon = 0;
unsigned long long bitmapsize;
struct mdinfo *sra;
struct mdinfo info, *infos;
int did_default = 0;
+ unsigned long safe_mode_delay = 0;
int major_num = BITMAP_MAJOR_HI;
int fd;
memset(&inf, 0, sizeof(inf));
- fd = open(devlist->devname, O_RDONLY, 0);
+ fd = open(devlist->devname, O_RDONLY);
if (fd >= 0 &&
ioctl(fd, GET_ARRAY_INFO, &inf) == 0 &&
inf.raid_disks == 0) {
minsize = freesize;
}
if (runstop != 1 || verbose >= 0) {
- int fd = open(dname, O_RDONLY, 0);
+ int fd = open(dname, O_RDONLY);
if (fd <0 ) {
fprintf(stderr, Name ": Cannot open %s: %s\n",
dname, strerror(errno));
st->ss->getinfo_super(st, &info);
if (did_default && verbose >= 0) {
- if (info.text_version[0] == '/') {
+ if (is_subarray(info.text_version)) {
int dnum = devname2devnum(info.text_version+1);
char *path;
int mdp = get_mdp_major();
inf->disk.state |= (1<<MD_DISK_WRITEMOSTLY);
if (st->ss->external && st->subarray[0])
- fd = open(dv->devname, O_RDWR, 0);
+ fd = open(dv->devname, O_RDWR);
else
- fd = open(dv->devname, O_RDWR|O_EXCL,0);
+ fd = open(dv->devname, O_RDWR|O_EXCL);
if (fd < 0) {
fprintf(stderr, Name ": failed to open %s "
st->ss->add_to_super(st, &inf->disk,
fd, dv->devname);
st->ss->getinfo_super(st, inf);
+ safe_mode_delay = inf->safe_mode_delay;
/* getinfo_super might have lost these ... */
inf->disk.major = major(stb.st_rdev);
inf->errors = 0;
rv = 0;
- if (st->ss->external)
- rv = sysfs_add_disk(sra, inf);
- else
- rv = ioctl(mdfd, ADD_NEW_DISK,
- &inf->disk);
+ rv = add_disk(mdfd, st, sra, inf);
if (rv) {
fprintf(stderr,
"readonly");
break;
}
+ sysfs_set_safemode(sra, safe_mode_delay);
} else {
mdu_param_t param;
if (ioctl(mdfd, RUN_ARRAY, ¶m)) {
if (verbose >= 0)
fprintf(stderr, Name ": array %s started.\n", mddev);
if (st->ss->external && st->subarray[0]) {
- if (need_mdmon && !env_no_mdmon()) {
- int dn = st->container_dev;
- int i;
- switch(fork()) {
- case 0:
- /* FIXME yuk. CLOSE_EXEC?? */
- for (i=3; i < 100; i++)
- close(i);
- execl("./mdmon", "mdmon",
- map_dev(dev2major(dn),
- dev2minor(dn),
- 1), NULL);
- exit(1);
- case -1: fprintf(stderr, Name ": cannot fork. "
- "Array remains readonly\n");
- return 1;
- default: ; /* parent - good */
- }
- } else
- signal_mdmon(st->container_dev);
- /* FIXME wait for mdmon to set array to read-auto */
- sleep(1);
+ if (need_mdmon)
+ start_mdmon(st->container_dev);
+
+ ping_monitor(devnum2devname(st->container_dev));
close(container_fd);
}
} else {