diff --git a/kernel/signal.c b/kernel/signal.c index cf498d949f2f3ab1c101ec93567c93901765ac9d..e2025f9eb53820c324e8485a3f4d6bd3a26cb546 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -2760,6 +2760,14 @@ bool get_signal(struct ksignal *ksig) do_coredump(&ksig->info); } + /* + * PF_IO_WORKER threads will catch and exit on fatal signals + * themselves. They have cleanup that must be performed, so + * we cannot call do_exit() on their behalf. + */ + if (current->flags & PF_IO_WORKER) + goto out; + /* * Death signals, no core dump. */ @@ -2767,7 +2775,7 @@ bool get_signal(struct ksignal *ksig) /* NOTREACHED */ } spin_unlock_irq(&sighand->siglock); - +out: ksig->sig = signr; return ksig->sig > 0; }