[dm-devel] [PATCH V7 1/4] libmpathcmd: Block SIGPIPE when write()

Gris Ge fge at redhat.com
Fri Aug 12 12:12:37 UTC 2016


 * Just block SIGPIPE when write() and restore it when done.
 * Use 'errno_save()' to preserve the errno of write().

Signed-off-by: Gris Ge <fge at redhat.com>
---
 libmpathcmd/mpath_cmd.c | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/libmpathcmd/mpath_cmd.c b/libmpathcmd/mpath_cmd.c
index 2290ecb..0daaf53 100644
--- a/libmpathcmd/mpath_cmd.c
+++ b/libmpathcmd/mpath_cmd.c
@@ -7,6 +7,7 @@
 #include <poll.h>
 #include <string.h>
 #include <errno.h>
+#include <signal.h>
 
 #include "mpath_cmd.h"
 
@@ -54,20 +55,33 @@ static ssize_t read_all(int fd, void *buf, size_t len, unsigned int timeout)
 static size_t write_all(int fd, const void *buf, size_t len)
 {
 	size_t total = 0;
+	sigset_t set, old;
+	int errno_save = 0;
+
+	/* Block SIGPIPE */
+	sigemptyset(&set);
+	sigaddset(&set, SIGPIPE);
+	pthread_sigmask(SIG_BLOCK, &set, &old);
 
 	while (len) {
 		ssize_t n = write(fd, buf, len);
+		errno_save = errno;
 		if (n < 0) {
 			if ((errno == EINTR) || (errno == EAGAIN))
 				continue;
-			return total;
+			goto out;
 		}
 		if (!n)
-			return total;
+			goto out;
 		buf = n + (char *)buf;
 		len -= n;
 		total += n;
 	}
+out:
+	/* And unblock it again */
+	pthread_sigmask(SIG_SETMASK, &old, NULL);
+	errno = errno_save;
+
 	return total;
 }
 
-- 
2.9.2




More information about the dm-devel mailing list