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

Sagi Grimberg sagi at grimberg.me
Thu Jan 28 20:54:22 EST 2021


No commit message?

> 
> Signed-off-by: Martin Wilck <mwilck at suse.com>
> ---
>   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");
> 



More information about the Linux-nvme mailing list