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 {
sysfs_set_str(sra, NULL, "array_state",
"readonly");
/* start mdmon if needed. */
- if (mdmon_running(st->container_dev))
- signal_mdmon(st->container_dev);
- else if (!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 */
- }
- }
+ if (!mdmon_running(st->container_dev))
+ start_mdmon(st->container_dev);
+ ping_monitor(devnum2devname(st->container_dev));
break;
}
if (verbose >= 0)
extern int mdmon_running(int devnum);
extern int signal_mdmon(int devnum);
extern int env_no_mdmon(void);
+extern int start_mdmon(int devnum);
extern char *devnum2devname(int num);
extern int devname2devnum(char *name);
return 0;
}
+int start_mdmon(int devnum)
+{
+ int i;
+
+ if (env_no_mdmon())
+ return 0;
+
+ switch(fork()) {
+ case 0:
+ /* FIXME yuk. CLOSE_EXEC?? */
+ for (i=3; i < 100; i++)
+ close(i);
+ execl("./mdmon", "mdmon",
+ map_dev(dev2major(devnum),
+ dev2minor(devnum),
+ 1), NULL);
+ exit(1);
+ case -1: fprintf(stderr, Name ": cannot run mdmon. "
+ "Array remains readonly\n");
+ return -1;
+ default: ; /* parent - good */
+ }
+ return 0;
+}
+
int env_no_mdmon(void)
{
char *val = getenv("MDADM_NO_MDMON");