diff options
author | Dan Williams <dan.j.williams@intel.com> | 2008-10-02 06:32:08 -0700 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2008-10-15 14:43:57 -0700 |
commit | 6144ed441445ee4d567614aaed78dd24148881ce (patch) | |
tree | 7c98537390691aca6739ea2ed9f4d151a9a9f027 /mdmon.c | |
parent | 57ed8c9155d31ca78c48979f4f98d40e4c0deac3 (diff) | |
download | mdadm-6144ed441445ee4d567614aaed78dd24148881ce.tar.gz mdadm-6144ed441445ee4d567614aaed78dd24148881ce.tar.xz mdadm-6144ed441445ee4d567614aaed78dd24148881ce.zip |
mdmon: terminate clean
We generally don't want mdmon to be terminated, but if a SIGTERM gets
through try to leave the monitored arrays in a clean state, block
attempts to mark the array dirty, and stop servicing the socket.
When we are killed by sigterm don't remove the pidfile let that be
cleaned up by the next monitor.
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'mdmon.c')
-rw-r--r-- | mdmon.c | 19 |
1 files changed, 19 insertions, 0 deletions
@@ -49,6 +49,8 @@ struct active_array *pending_discard; int mon_tid, mgr_tid; +int sigterm; + int run_child(void *v) { struct supertype *c = v; @@ -87,6 +89,9 @@ int make_pidfile(char *devname, int o_excl) int fd; int n; + if (sigterm) + return -1; + sprintf(path, "/var/run/mdadm/%s.pid", devname); fd = open(path, O_RDWR|O_CREAT|o_excl, 0600); @@ -138,6 +143,9 @@ void remove_pidfile(char *devname) { char buf[100]; + if (sigterm) + return; + sprintf(buf, "/var/run/mdadm/%s.pid", devname); unlink(buf); sprintf(buf, "/var/run/mdadm/%s.sock", devname); @@ -151,6 +159,9 @@ int make_control_sock(char *devname) long fl; struct sockaddr_un addr; + if (sigterm) + return -1; + sprintf(path, "/var/run/mdadm/%s.sock", devname); unlink(path); sfd = socket(PF_LOCAL, SOCK_STREAM, 0); @@ -176,6 +187,11 @@ static void hup(int sig) socket_hup_requested = 1; } +static void term(int sig) +{ + sigterm = 1; +} + static void wake_me(int sig) { @@ -355,6 +371,7 @@ int main(int argc, char *argv[]) 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; @@ -362,6 +379,8 @@ int main(int argc, char *argv[]) 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); |