Merged.
Thanks.
On Tue, Aug 16, 2016 at 10:08 PM, Bart Van Assche <bart.vanassche@xxxxxxxxxxx> wrote:
The behavior we want is as follows:
* If stdout or stderr is closed then SIGPIPE causes termination.
* Sending data to a socket that has been closed by the receiver
does not cause multipathd to stop.
Hence unblock SIGPIPE and use MSG_NOSIGNAL when sending data over
a socket.
Signed-off-by: Bart Van Assche <bart.vanassche@xxxxxxxxxxx>
Cc: Benjamin Marzinski <bmarzins@xxxxxxxxxx>
Cc: Gris Ge <fge@xxxxxxxxxx>
---
libmpathcmd/mpath_cmd.c | 4 ++--
libmultipath/uxsock.c | 17 ++---------------
multipathd/main.c | 8 +-------
3 files changed, 5 insertions(+), 24 deletions(-)
diff --git a/libmpathcmd/mpath_cmd.c b/libmpathcmd/mpath_cmd.c
index c058479..667a2dc 100644
--- a/libmpathcmd/mpath_cmd.c
+++ b/libmpathcmd/mpath_cmd.c
@@ -33,7 +33,7 @@ static ssize_t read_all(int fd, void *buf, size_t len, unsigned int timeout)
return -1;
} else if (!pfd.revents & POLLIN)
continue;
- n = read(fd, buf, len);
+ n = recv(fd, buf, len, 0);
if (n < 0) {
if ((errno == EINTR) || (errno == EAGAIN))
continue;
@@ -56,7 +56,7 @@ static size_t write_all(int fd, const void *buf, size_t len)
size_t total = 0;
while (len) {
- ssize_t n = write(fd, buf, len);
+ ssize_t n = send(fd, buf, len, MSG_NOSIGNAL);
if (n < 0) {
if ((errno == EINTR) || (errno == EAGAIN))
continue;
diff --git a/libmultipath/uxsock.c b/libmultipath/uxsock.c
index 775e278..880257f 100644
--- a/libmultipath/uxsock.c
+++ b/libmultipath/uxsock.c
@@ -81,7 +81,7 @@ size_t write_all(int fd, const void *buf, size_t len)
size_t total = 0;
while (len) {
- ssize_t n = write(fd, buf, len);
+ ssize_t n = send(fd, buf, len, MSG_NOSIGNAL);
if (n < 0) {
if ((errno == EINTR) || (errno == EAGAIN))
continue;
@@ -138,20 +138,7 @@ ssize_t read_all(int fd, void *buf, size_t len, unsigned int timeout)
*/
int send_packet(int fd, const char *buf)
{
- int ret = 0;
- sigset_t set, old;
-
- /* Block SIGPIPE */
- sigemptyset(&set);
- sigaddset(&set, SIGPIPE);
- pthread_sigmask(SIG_BLOCK, &set, &old);
-
- ret = mpath_send_cmd(fd, buf);
-
- /* And unblock it again */
- pthread_sigmask(SIG_SETMASK, &old, NULL);
-
- return ret;
+ return mpath_send_cmd(fd, buf);
}
/*
diff --git a/multipathd/main.c b/multipathd/main.c
index 54abfef..2be6cb2 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -2125,18 +2125,12 @@ sigusr2 (int sig)
static void
signal_init(void)
{
- sigset_t set;
-
- sigemptyset(&set);
- sigaddset(&set, SIGPIPE);
- pthread_sigmask(SIG_SETMASK, &set, NULL);
-
signal_set(SIGHUP, sighup);
signal_set(SIGUSR1, sigusr1);
signal_set(SIGUSR2, sigusr2);
signal_set(SIGINT, sigend);
signal_set(SIGTERM, sigend);
- signal(SIGPIPE, SIG_IGN);
+ signal_set(SIGPIPE, sigend);
}
static void
--
2.9.2
-- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel