summaryrefslogtreecommitdiffstats
path: root/managemon.c
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2008-10-02 06:32:08 -0700
committerDan Williams <dan.j.williams@intel.com>2008-10-15 14:43:57 -0700
commit6144ed441445ee4d567614aaed78dd24148881ce (patch)
tree7c98537390691aca6739ea2ed9f4d151a9a9f027 /managemon.c
parent57ed8c9155d31ca78c48979f4f98d40e4c0deac3 (diff)
downloadmdadm-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 'managemon.c')
-rw-r--r--managemon.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/managemon.c b/managemon.c
index 730334c..a8af614 100644
--- a/managemon.c
+++ b/managemon.c
@@ -555,7 +555,7 @@ static void handle_message(struct supertype *container, struct metadata_update *
manage(mdstat, container);
free_mdstat(mdstat);
- } else {
+ } else if (!sigterm) {
mu = malloc(sizeof(*mu));
mu->len = msg->len;
mu->buf = msg->buf;
@@ -612,6 +612,7 @@ void do_manager(struct supertype *container)
sigdelset(&set, SIGUSR1);
sigdelset(&set, SIGHUP);
sigdelset(&set, SIGALRM);
+ sigdelset(&set, SIGTERM);
proc_fd = open("/proc/mounts", O_RDONLY);
do {
@@ -647,6 +648,9 @@ void do_manager(struct supertype *container)
manager_ready = 1;
+ if (sigterm)
+ wakeup_monitor();
+
if (update_queue == NULL) {
if (container->sock < 0)
mdstat_wait_fd(proc_fd, &set);