From 9540cc244dfc56d40f686d8f63aa5b6d73663bcf Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Mon, 5 Aug 2013 14:55:13 +1000 Subject: [PATCH] test: ensure testing uses correct mdmon When testing we want to run mdmon directly, not use systemctl to get systemd to run it. So allow an environment variable to make that choice. Signed-off-by: NeilBrown --- test | 3 +++ util.c | 63 ++++++++++++++++++++++++++++++---------------------------- 2 files changed, 36 insertions(+), 30 deletions(-) diff --git a/test b/test index 9e140f0a..8e8d1df3 100755 --- a/test +++ b/test @@ -30,6 +30,9 @@ if grep -s 'Personalities : .*multipath' > /dev/null /proc/mdstat ; then fi INTEGRITY=yes +# make sure to test local mdmon, not system one +export MDADM_NO_SYSTEMCTL=1 + # assume md0, md1, md2 exist in /dev md0=/dev/md0 md1=/dev/md1 md2=/dev/md2 mdp0=/dev/md_d0 diff --git a/util.c b/util.c index aa2c8be8..e7e3d488 100644 --- a/util.c +++ b/util.c @@ -1711,36 +1711,39 @@ int start_mdmon(char *devnm) pathbuf[0] = '\0'; /* First try to run systemctl */ - switch(fork()) { - case 0: - /* FIXME yuk. CLOSE_EXEC?? */ - skipped = 0; - for (i = 3; skipped < 20; i++) - if (close(i) < 0) - skipped++; - else - skipped = 0; - - /* Don't want to see error messages from systemctl. - * If the service doesn't exist, we start mdmon ourselves. - */ - close(2); - open("/dev/null", O_WRONLY); - snprintf(pathbuf, sizeof(pathbuf), "mdmon@%s.service", - devnm); - status = execl("/usr/bin/systemctl", "systemctl", "start", - pathbuf, NULL); - status = execl("/bin/systemctl", "systemctl", "start", - pathbuf, NULL); - exit(1); - case -1: pr_err("cannot run mdmon. " - "Array remains readonly\n"); - return -1; - default: /* parent - good */ - pid = wait(&status); - if (pid >= 0 && status == 0) - return 0; - } + if (!check_env("MDADM_NO_SYSTEMCTL")) + switch(fork()) { + case 0: + /* FIXME yuk. CLOSE_EXEC?? */ + skipped = 0; + for (i = 3; skipped < 20; i++) + if (close(i) < 0) + skipped++; + else + skipped = 0; + + /* Don't want to see error messages from + * systemctl. If the service doesn't exist, + * we start mdmon ourselves. + */ + close(2); + open("/dev/null", O_WRONLY); + snprintf(pathbuf, sizeof(pathbuf), "mdmon@%s.service", + devnm); + status = execl("/usr/bin/systemctl", "systemctl", + "start", + pathbuf, NULL); + status = execl("/bin/systemctl", "systemctl", "start", + pathbuf, NULL); + exit(1); + case -1: pr_err("cannot run mdmon. " + "Array remains readonly\n"); + return -1; + default: /* parent - good */ + pid = wait(&status); + if (pid >= 0 && status == 0) + return 0; + } /* That failed, try running mdmon directly */ switch(fork()) { -- 2.39.2