summaryrefslogtreecommitdiffstats
path: root/mdmon.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 /mdmon.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 'mdmon.c')
-rw-r--r--mdmon.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/mdmon.c b/mdmon.c
index 28b0139..7ef0c80 100644
--- a/mdmon.c
+++ b/mdmon.c
@@ -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);