[dm-devel] [PATCH 5/7] multipathd: Do not perform POSIX mutex operations inside a signal handler

Bart Van Assche bart.vanassche at sandisk.com
Wed Jul 27 21:13:46 UTC 2016


According to the POSIX standard, only functions that are async-signal-safe
may be invoked from inside a signal handler. The only POSIX thread functions
that are async-signal-safe are pthread_kill(), pthread_self() and
pthread_sigmask(). See also
http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04_03.

Signed-off-by: Bart Van Assche <bart.vanassche at sandisk.com>
---
 multipathd/main.c   | 12 +++++++++++-
 multipathd/uxlsnr.c |  2 --
 multipathd/uxlsnr.h |  3 ---
 3 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/multipathd/main.c b/multipathd/main.c
index 0cd822b..429921c 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -117,6 +117,11 @@ struct udev * udev;
 
 struct config *multipath_conf;
 
+/* Local variables */
+static volatile sig_atomic_t exit_sig;
+static volatile sig_atomic_t reconfig_sig;
+static volatile sig_atomic_t log_reset_sig;
+
 const char *
 daemon_status(void)
 {
@@ -2070,6 +2075,10 @@ signal_set(int signo, void (*func) (int))
 void
 handle_signals(void)
 {
+	if (exit_sig) {
+		condlog(2, "exit (signal)");
+		exit_daemon();
+	}
 	if (reconfig_sig) {
 		condlog(2, "reconfigure (signal)");
 		set_config_state(DAEMON_CONFIGURE);
@@ -2080,6 +2089,7 @@ handle_signals(void)
 		log_reset("multipathd");
 		pthread_mutex_unlock(&logq_lock);
 	}
+	exit_sig = 0;
 	reconfig_sig = 0;
 	log_reset_sig = 0;
 }
@@ -2093,7 +2103,7 @@ sighup (int sig)
 static void
 sigend (int sig)
 {
-	exit_daemon();
+	exit_sig = 1;
 }
 
 static void
diff --git a/multipathd/uxlsnr.c b/multipathd/uxlsnr.c
index 0159648..d2ef0b8 100644
--- a/multipathd/uxlsnr.c
+++ b/multipathd/uxlsnr.c
@@ -49,8 +49,6 @@ struct client {
 LIST_HEAD(clients);
 pthread_mutex_t client_lock = PTHREAD_MUTEX_INITIALIZER;
 struct pollfd *polls;
-volatile sig_atomic_t reconfig_sig = 0;
-volatile sig_atomic_t log_reset_sig = 0;
 
 /*
  * handle a new client joining
diff --git a/multipathd/uxlsnr.h b/multipathd/uxlsnr.h
index 7839fce..4ef47d5 100644
--- a/multipathd/uxlsnr.h
+++ b/multipathd/uxlsnr.h
@@ -6,7 +6,4 @@ typedef int (uxsock_trigger_fn)(char *, char **, int *, void *);
 void * uxsock_listen(uxsock_trigger_fn uxsock_trigger,
 		     void * trigger_data);
 
-extern volatile sig_atomic_t reconfig_sig;
-extern volatile sig_atomic_t log_reset_sig;
-
 #endif
-- 
2.9.2




More information about the dm-devel mailing list