[dm-devel] [PATCH] multipath-tools: handle exit signal immediately
Martin Wilck
mwilck at suse.com
Tue Jan 30 13:47:08 UTC 2018
multipathd shouldn't try to service any more client connections
when it receives an exit signal. Based on an analysis by Chongyun Wu.
Reported-by: Chongyun Wu <wu.chongyun at h3c.com>
Signed-off-by: Martin Wilck <mwilck at suse.com>
---
multipathd/main.c | 6 ++++--
multipathd/main.h | 2 +-
multipathd/uxlsnr.c | 5 +++--
3 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/multipathd/main.c b/multipathd/main.c
index 27cf234623d0..8e96f5dd2d7f 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -2184,12 +2184,15 @@ signal_set(int signo, void (*func) (int))
}
void
-handle_signals(void)
+handle_signals(bool nonfatal)
{
if (exit_sig) {
condlog(2, "exit (signal)");
+ exit_sig = 0;
exit_daemon();
}
+ if (!nonfatal)
+ return;
if (reconfig_sig) {
condlog(2, "reconfigure (signal)");
set_config_state(DAEMON_CONFIGURE);
@@ -2200,7 +2203,6 @@ handle_signals(void)
log_reset("multipathd");
pthread_mutex_unlock(&logq_lock);
}
- exit_sig = 0;
reconfig_sig = 0;
log_reset_sig = 0;
}
diff --git a/multipathd/main.h b/multipathd/main.h
index ededdaba32fe..e8140feaf291 100644
--- a/multipathd/main.h
+++ b/multipathd/main.h
@@ -38,6 +38,6 @@ int mpath_pr_event_handle(struct path *pp);
void * mpath_pr_event_handler_fn (void * );
int update_map_pr(struct multipath *mpp);
void * mpath_pr_event_handler_fn (void * pathp );
-void handle_signals(void);
+void handle_signals(bool);
#endif /* MAIN_H */
diff --git a/multipathd/uxlsnr.c b/multipathd/uxlsnr.c
index 98ac25a68c43..330685efa27d 100644
--- a/multipathd/uxlsnr.c
+++ b/multipathd/uxlsnr.c
@@ -221,9 +221,10 @@ void * uxsock_listen(uxsock_trigger_fn uxsock_trigger, void * trigger_data)
/* most of our life is spent in this call */
poll_count = ppoll(polls, i, &sleep_time, &mask);
+ handle_signals(false);
if (poll_count == -1) {
if (errno == EINTR) {
- handle_signals();
+ handle_signals(true);
continue;
}
@@ -233,7 +234,7 @@ void * uxsock_listen(uxsock_trigger_fn uxsock_trigger, void * trigger_data)
}
if (poll_count == 0) {
- handle_signals();
+ handle_signals(true);
continue;
}
--
2.16.1
More information about the dm-devel
mailing list