Thread (89 messages) 89 messages, 4 authors, 2021-02-22

Re: [PATCH 16/35] monitor: reset children's signal disposition

From: Sagi Grimberg <sagi@grimberg.me>
Date: 2021-01-29 01:54:36

No commit message?
quoted hunk ↗ jump to hunk
Signed-off-by: Martin Wilck <redacted>
---
  monitor.c | 30 ++++++++++++++++++++++++++++--
  1 file changed, 28 insertions(+), 2 deletions(-)
diff --git a/monitor.c b/monitor.c
index 69c8333..9375a14 100644
--- a/monitor.c
+++ b/monitor.c
@@ -100,6 +100,8 @@ static void monitor_int_handler(int sig)
  	must_exit = 1;
  }
  
+static sigset_t orig_sigmask;
+
  static int monitor_init_signals(void)
  {
  	sigset_t mask;
@@ -110,7 +112,7 @@ static int monitor_init_signals(void)
  	 * for events.
  	 */
  	sigfillset(&mask);
-	if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1)
+	if (sigprocmask(SIG_BLOCK, &mask, &orig_sigmask) == -1)
  		return -errno;
  	if (sigaction(SIGTERM, &sa, NULL) == -1)
  		return -errno;
@@ -119,6 +121,26 @@ static int monitor_init_signals(void)
  	return 0;
  }
  
+static int child_reset_signals(void)
+{
+	int err = 0;
+	struct sigaction sa = { .sa_handler = SIG_DFL, };
+
+	if (sigaction(SIGTERM, &sa, NULL) == -1)
+		err = errno;
+	if (sigaction(SIGINT, &sa, NULL) == -1 && !err)
+		err = errno;
+	if (sigaction(SIGCHLD, &sa, NULL) == -1 && !err)
+		err = errno;
+
+	if (sigprocmask(SIG_SETMASK, &orig_sigmask, NULL) == -1 && !err)
+		err = errno;
+
+	if (err)
+		log(LOG_ERR, "error resetting signal handlers and mask\n");
+	return -err;
+}
+
  static int monitor_get_fc_uev_props(struct udev_device *ud,
  				    char *traddr, size_t tra_sz,
  				    char *host_traddr, size_t htra_sz)
@@ -176,8 +198,12 @@ static int monitor_discovery(char *transport, char *traddr, char *trsvcid,
  	if (pid == -1) {
  		log(LOG_ERR, "failed to fork discovery task: %m");
  		return -errno;
-	} else if (pid > 0)
+	} else if (pid > 0) {
+		log(LOG_DEBUG, "started discovery task %ld\n", (long)pid);
  		return 0;
+	}
+
+	child_reset_signals();
  
  	log(LOG_NOTICE, "starting %s discovery for %s==>%s(%s)\n",
  	    transport, host_traddr, traddr, trsvcid ? trsvcid : "none");
_______________________________________________
Linux-nvme mailing list
Linux-nvme@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-nvme
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help