diff options
author | NeilBrown <neilb@suse.de> | 2010-02-08 14:30:46 +1100 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2010-02-08 17:26:18 +1100 |
commit | fa716c83c5be8093e663e260e46e73ea9ad6facf (patch) | |
tree | d114ff6697fd4c85c090facb2a13ba52d19c1eeb /mdmon.c | |
parent | 58a4ba2a6b66ac14fa0ebaf0ce40326582d31429 (diff) | |
download | mdadm-fa716c83c5be8093e663e260e46e73ea9ad6facf.tar.gz mdadm-fa716c83c5be8093e663e260e46e73ea9ad6facf.tar.xz mdadm-fa716c83c5be8093e663e260e46e73ea9ad6facf.zip |
mdmon: insist on creating .pid file at startup.
Now that we don't "mdadm --takeover" until /var/run is writable
there is no need to continually try to create files in there.
So only create these files at startup and fail if they cannot be
made. This means that to start an array with externally managed
metadata, either /var/run or ALT_RUN (e.g. /lib/init/rw) must be
writable. To 'takeover' from a previous mdmon instance, /var/run
must be writable.
This means we don't need to worry about SIGHUP (which was once used to
tell us it was time to create .pid) and SIGALRM.
Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'mdmon.c')
-rw-r--r-- | mdmon.c | 44 |
1 files changed, 29 insertions, 15 deletions
@@ -113,7 +113,7 @@ static struct superswitch *find_metadata_methods(char *vers) return NULL; } -int make_pidfile(char *devname) +static int make_pidfile(char *devname) { char path[100]; char pid[10]; @@ -192,7 +192,7 @@ void remove_pidfile(char *devname) rmdir(pid_dir); } -int make_control_sock(char *devname) +static int make_control_sock(char *devname) { char path[100]; int sfd; @@ -221,12 +221,6 @@ int make_control_sock(char *devname) return sfd; } -int socket_hup_requested; -static void hup(int sig) -{ - socket_hup_requested = 1; -} - static void term(int sig) { sigterm = 1; @@ -431,24 +425,25 @@ static int mdmon(char *devname, int devnum, int must_fork, int takeover) */ sigemptyset(&set); sigaddset(&set, SIGUSR1); - sigaddset(&set, SIGHUP); - sigaddset(&set, SIGALRM); sigaddset(&set, SIGTERM); sigprocmask(SIG_BLOCK, &set, NULL); act.sa_handler = wake_me; act.sa_flags = 0; sigaction(SIGUSR1, &act, NULL); - sigaction(SIGALRM, &act, NULL); - act.sa_handler = hup; - sigaction(SIGHUP, &act, NULL); act.sa_handler = term; sigaction(SIGTERM, &act, NULL); act.sa_handler = SIG_IGN; sigaction(SIGPIPE, &act, NULL); if (takeover) { + pid_dir = VAR_RUN; victim = mdmon_pid(container->devnum); - victim_sock = connect_monitor(container->devname); + if (victim < 0) { + pid_dir = ALT_RUN; + victim = mdmon_pid(container->devnum); + } + if (victim >= 0) + victim_sock = connect_monitor(container->devname); } ignore = chdir("/"); @@ -470,6 +465,25 @@ static int mdmon(char *devname, int devnum, int must_fork, int takeover) /* Ok, this is close enough. We can say goodbye to our parent now. */ + if (victim > 0) + remove_pidfile(devname); + if (mkdir(VAR_RUN, 0600) >= 0 || errno == EEXIST) + pid_dir = VAR_RUN; + else if (mkdir(ALT_RUN, 0600) >= 0 || errno == EEXIST) + pid_dir = ALT_RUN; + else { + fprintf(stderr, "mdmon: Neither %s nor %s are writable\n" + " cannot create .pid or .sock files. Aborting\n", + VAR_RUN, ALT_RUN); + exit(3); + } + if (make_pidfile(devname) < 0) { + fprintf(stderr, "mdmon: Cannot create pid file in %s - aborting.\n", + pid_dir); + exit(3); + } + container->sock = make_control_sock(devname); + status = 0; if (write(pfd[1], &status, sizeof(status)) < 0) fprintf(stderr, "mdmon: failed to notify our parent: %d\n", @@ -484,7 +498,7 @@ static int mdmon(char *devname, int devnum, int must_fork, int takeover) exit(2); } - if (victim > -1) { + if (victim > 0) { try_kill_monitor(victim, container->devname, victim_sock); close(victim_sock); } |