mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 19:56:18 +00:00
allow_signal: kill the bogus ->mm check, add a note about CLONE_SIGHAND
allow_signal() checks ->mm == NULL. Not sure why. Perhaps to make sure current is the kernel thread. But this helper must not be used unless we are the kernel thread, kill this check. Also, document the fact that the CLONE_SIGHAND kthread must not use allow_signal(), unless the caller really wants to change the parent's ->sighand->action as well. Signed-off-by: Oleg Nesterov <oleg@redhat.com> Acked-by: Roland McGrath <roland@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
2ffebca6aa
commit
87245135d5
1 changed files with 9 additions and 10 deletions
|
@ -375,9 +375,8 @@ static void set_special_pids(struct pid *pid)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Let kernel threads use this to say that they
|
* Let kernel threads use this to say that they allow a certain signal.
|
||||||
* allow a certain signal (since daemonize() will
|
* Must not be used if kthread was cloned with CLONE_SIGHAND.
|
||||||
* have disabled all of them by default).
|
|
||||||
*/
|
*/
|
||||||
int allow_signal(int sig)
|
int allow_signal(int sig)
|
||||||
{
|
{
|
||||||
|
@ -385,14 +384,14 @@ int allow_signal(int sig)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
spin_lock_irq(¤t->sighand->siglock);
|
spin_lock_irq(¤t->sighand->siglock);
|
||||||
|
/* This is only needed for daemonize()'ed kthreads */
|
||||||
sigdelset(¤t->blocked, sig);
|
sigdelset(¤t->blocked, sig);
|
||||||
if (!current->mm) {
|
/*
|
||||||
/* Kernel threads handle their own signals.
|
* Kernel threads handle their own signals. Let the signal code
|
||||||
Let the signal code know it'll be handled, so
|
* know it'll be handled, so that they don't get converted to
|
||||||
that they don't get converted to SIGKILL or
|
* SIGKILL or just silently dropped.
|
||||||
just silently dropped */
|
*/
|
||||||
current->sighand->action[(sig)-1].sa.sa_handler = (void __user *)2;
|
current->sighand->action[(sig)-1].sa.sa_handler = (void __user *)2;
|
||||||
}
|
|
||||||
recalc_sigpending();
|
recalc_sigpending();
|
||||||
spin_unlock_irq(¤t->sighand->siglock);
|
spin_unlock_irq(¤t->sighand->siglock);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in a new issue