diff options
Diffstat (limited to 'kernel/exit.c')
| -rw-r--r-- | kernel/exit.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index b6c90b5ef509..533e5f85669a 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
| @@ -375,9 +375,8 @@ static void set_special_pids(struct pid *pid) | |||
| 375 | } | 375 | } |
| 376 | 376 | ||
| 377 | /* | 377 | /* |
| 378 | * Let kernel threads use this to say that they | 378 | * Let kernel threads use this to say that they allow a certain signal. |
| 379 | * allow a certain signal (since daemonize() will | 379 | * Must not be used if kthread was cloned with CLONE_SIGHAND. |
| 380 | * have disabled all of them by default). | ||
| 381 | */ | 380 | */ |
| 382 | int allow_signal(int sig) | 381 | int allow_signal(int sig) |
| 383 | { | 382 | { |
| @@ -385,14 +384,14 @@ int allow_signal(int sig) | |||
| 385 | return -EINVAL; | 384 | return -EINVAL; |
| 386 | 385 | ||
| 387 | spin_lock_irq(¤t->sighand->siglock); | 386 | spin_lock_irq(¤t->sighand->siglock); |
| 387 | /* This is only needed for daemonize()'ed kthreads */ | ||
| 388 | sigdelset(¤t->blocked, sig); | 388 | sigdelset(¤t->blocked, sig); |
| 389 | if (!current->mm) { | 389 | /* |
| 390 | /* Kernel threads handle their own signals. | 390 | * Kernel threads handle their own signals. Let the signal code |
| 391 | Let the signal code know it'll be handled, so | 391 | * know it'll be handled, so that they don't get converted to |
| 392 | that they don't get converted to SIGKILL or | 392 | * SIGKILL or just silently dropped. |
| 393 | just silently dropped */ | 393 | */ |
| 394 | current->sighand->action[(sig)-1].sa.sa_handler = (void __user *)2; | 394 | current->sighand->action[(sig)-1].sa.sa_handler = (void __user *)2; |
| 395 | } | ||
| 396 | recalc_sigpending(); | 395 | recalc_sigpending(); |
| 397 | spin_unlock_irq(¤t->sighand->siglock); | 396 | spin_unlock_irq(¤t->sighand->siglock); |
| 398 | return 0; | 397 | return 0; |
