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