From 8850ee3e1ea01d4ded658fd83002fd93a81d6e99 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Fri, 18 Jul 2008 16:37:11 +1000 Subject: [PATCH] Factor common code into new "start_mdmon". Signed-off-by: Neil Brown --- Create.c | 26 ++++---------------------- Incremental.c | 25 +++---------------------- mdadm.h | 1 + util.c | 25 +++++++++++++++++++++++++ 4 files changed, 33 insertions(+), 44 deletions(-) diff --git a/Create.c b/Create.c index b2edc7d6..692a74cc 100644 --- a/Create.c +++ b/Create.c @@ -769,28 +769,10 @@ int Create(struct supertype *st, char *mddev, int mdfd, 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 { diff --git a/Incremental.c b/Incremental.c index e9a54578..9b222206 100644 --- a/Incremental.c +++ b/Incremental.c @@ -836,28 +836,9 @@ int Incremental_container(struct supertype *st, char *devname, int verbose, 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) diff --git a/mdadm.h b/mdadm.h index 3672bc9d..2c941cc0 100644 --- a/mdadm.h +++ b/mdadm.h @@ -774,6 +774,7 @@ extern int open_container(int fd); 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); diff --git a/util.c b/util.c index 283eeb6d..da61a0be 100644 --- a/util.c +++ b/util.c @@ -1074,6 +1074,31 @@ int signal_mdmon(int devnum) 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"); -- 2.39.2