58 lines
2.0 KiB
Diff
58 lines
2.0 KiB
Diff
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: Martin Wilck <mwilck@suse.com>
|
||
|
Date: Wed, 21 Mar 2018 10:34:19 +0100
|
||
|
Subject: [PATCH] multipathd: handle errors in uxlsnr as fatal
|
||
|
|
||
|
The ppoll() calls of the uxlsnr thread are vital for proper functioning of
|
||
|
multipathd. If the uxlsnr thread can't open the socket or fails to call ppoll()
|
||
|
for other reasons, quit the daemon. If we don't do that, multipathd may
|
||
|
hang in a state where it can't be terminated any more, because the uxlsnr
|
||
|
thread is responsible for handling all signals. This happens e.g. if
|
||
|
systemd's multipathd.socket is running in and multipathd is started from
|
||
|
outside systemd.
|
||
|
|
||
|
24f2844 "multipathd: fix signal blocking logic" has made this problem more
|
||
|
severe. Before that patch, the signals weren't actually blocked in any thread.
|
||
|
That's not to say 24f2844 was wrong. I still think it's correct, we just
|
||
|
need this one on top.
|
||
|
|
||
|
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||
|
---
|
||
|
multipathd/uxlsnr.c | 5 +++--
|
||
|
1 file changed, 3 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/multipathd/uxlsnr.c b/multipathd/uxlsnr.c
|
||
|
index cdafd82..6f66666 100644
|
||
|
--- a/multipathd/uxlsnr.c
|
||
|
+++ b/multipathd/uxlsnr.c
|
||
|
@@ -178,7 +178,7 @@ void * uxsock_listen(uxsock_trigger_fn uxsock_trigger, void * trigger_data)
|
||
|
|
||
|
if (ux_sock == -1) {
|
||
|
condlog(1, "could not create uxsock: %d", errno);
|
||
|
- return NULL;
|
||
|
+ exit_daemon();
|
||
|
}
|
||
|
|
||
|
pthread_cleanup_push(uxsock_cleanup, (void *)ux_sock);
|
||
|
@@ -187,7 +187,7 @@ void * uxsock_listen(uxsock_trigger_fn uxsock_trigger, void * trigger_data)
|
||
|
polls = (struct pollfd *)MALLOC((MIN_POLLS + 1) * sizeof(struct pollfd));
|
||
|
if (!polls) {
|
||
|
condlog(0, "uxsock: failed to allocate poll fds");
|
||
|
- return NULL;
|
||
|
+ exit_daemon();
|
||
|
}
|
||
|
sigfillset(&mask);
|
||
|
sigdelset(&mask, SIGINT);
|
||
|
@@ -249,6 +249,7 @@ void * uxsock_listen(uxsock_trigger_fn uxsock_trigger, void * trigger_data)
|
||
|
|
||
|
/* something went badly wrong! */
|
||
|
condlog(0, "uxsock: poll failed with %d", errno);
|
||
|
+ exit_daemon();
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
--
|
||
|
2.7.4
|
||
|
|