diff options
author | Oleg Nesterov <oleg@redhat.com> | 2014-06-06 17:36:53 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-06-06 19:08:11 -0400 |
commit | 0341729b4b832e753c5e745c6ba0e797f6198be0 (patch) | |
tree | 75e1a7743a1fbf38e27ec1c8e8ece1261fa71dd1 | |
parent | afe2b0386ac22b6a189a2067b25282cade3fbb4d (diff) |
signals: mv {dis,}allow_signal() from sched.h/exit.c to signal.[ch]
Move the declaration/definition of allow_signal/disallow_signal to
signal.h/signal.c. The new place is more logical and allows to use the
static helpers in signal.c (see the next changes).
While at it, make them return void and remove the valid_signal() check.
Nobody checks the returned value, and in-kernel users must not pass the
wrong signal number.
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Al Viro <viro@ZenIV.linux.org.uk>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Richard Weinberger <richard@nod.at>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Tejun Heo <tj@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | include/linux/sched.h | 3 | ||||
-rw-r--r-- | include/linux/signal.h | 2 | ||||
-rw-r--r-- | kernel/exit.c | 39 | ||||
-rw-r--r-- | kernel/signal.c | 29 |
4 files changed, 31 insertions, 42 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h index 8fcd0e6098d9..ea74596014a2 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -2414,9 +2414,6 @@ extern void flush_itimer_signals(void); | |||
2414 | 2414 | ||
2415 | extern void do_group_exit(int); | 2415 | extern void do_group_exit(int); |
2416 | 2416 | ||
2417 | extern int allow_signal(int); | ||
2418 | extern int disallow_signal(int); | ||
2419 | |||
2420 | extern int do_execve(struct filename *, | 2417 | extern int do_execve(struct filename *, |
2421 | const char __user * const __user *, | 2418 | const char __user * const __user *, |
2422 | const char __user * const __user *); | 2419 | const char __user * const __user *); |
diff --git a/include/linux/signal.h b/include/linux/signal.h index ae744c314630..ac83c593f4b9 100644 --- a/include/linux/signal.h +++ b/include/linux/signal.h | |||
@@ -284,6 +284,8 @@ extern int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka, | |||
284 | extern void signal_setup_done(int failed, struct ksignal *ksig, int stepping); | 284 | extern void signal_setup_done(int failed, struct ksignal *ksig, int stepping); |
285 | extern void signal_delivered(int sig, siginfo_t *info, struct k_sigaction *ka, struct pt_regs *regs, int stepping); | 285 | extern void signal_delivered(int sig, siginfo_t *info, struct k_sigaction *ka, struct pt_regs *regs, int stepping); |
286 | extern void exit_signals(struct task_struct *tsk); | 286 | extern void exit_signals(struct task_struct *tsk); |
287 | extern void allow_signal(int); | ||
288 | extern void disallow_signal(int); | ||
287 | 289 | ||
288 | /* | 290 | /* |
289 | * Eventually that'll replace get_signal_to_deliver(); macro for now, | 291 | * Eventually that'll replace get_signal_to_deliver(); macro for now, |
diff --git a/kernel/exit.c b/kernel/exit.c index 750c2e594617..e5c4668f1799 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
@@ -313,45 +313,6 @@ kill_orphaned_pgrp(struct task_struct *tsk, struct task_struct *parent) | |||
313 | } | 313 | } |
314 | } | 314 | } |
315 | 315 | ||
316 | /* | ||
317 | * Let kernel threads use this to say that they allow a certain signal. | ||
318 | * Must not be used if kthread was cloned with CLONE_SIGHAND. | ||
319 | */ | ||
320 | int allow_signal(int sig) | ||
321 | { | ||
322 | if (!valid_signal(sig) || sig < 1) | ||
323 | return -EINVAL; | ||
324 | |||
325 | spin_lock_irq(¤t->sighand->siglock); | ||
326 | /* This is only needed for daemonize()'ed kthreads */ | ||
327 | sigdelset(¤t->blocked, sig); | ||
328 | /* | ||
329 | * Kernel threads handle their own signals. Let the signal code | ||
330 | * know it'll be handled, so that they don't get converted to | ||
331 | * SIGKILL or just silently dropped. | ||
332 | */ | ||
333 | current->sighand->action[(sig)-1].sa.sa_handler = (void __user *)2; | ||
334 | recalc_sigpending(); | ||
335 | spin_unlock_irq(¤t->sighand->siglock); | ||
336 | return 0; | ||
337 | } | ||
338 | |||
339 | EXPORT_SYMBOL(allow_signal); | ||
340 | |||
341 | int disallow_signal(int sig) | ||
342 | { | ||
343 | if (!valid_signal(sig) || sig < 1) | ||
344 | return -EINVAL; | ||
345 | |||
346 | spin_lock_irq(¤t->sighand->siglock); | ||
347 | current->sighand->action[(sig)-1].sa.sa_handler = SIG_IGN; | ||
348 | recalc_sigpending(); | ||
349 | spin_unlock_irq(¤t->sighand->siglock); | ||
350 | return 0; | ||
351 | } | ||
352 | |||
353 | EXPORT_SYMBOL(disallow_signal); | ||
354 | |||
355 | #ifdef CONFIG_MEMCG | 316 | #ifdef CONFIG_MEMCG |
356 | /* | 317 | /* |
357 | * A task is exiting. If it owned this mm, find a new owner for the mm. | 318 | * A task is exiting. If it owned this mm, find a new owner for the mm. |
diff --git a/kernel/signal.c b/kernel/signal.c index a6d8c3af0ad6..7d6ff8b18509 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -3066,6 +3066,35 @@ COMPAT_SYSCALL_DEFINE4(rt_tgsigqueueinfo, | |||
3066 | } | 3066 | } |
3067 | #endif | 3067 | #endif |
3068 | 3068 | ||
3069 | /* | ||
3070 | * Let kernel threads use this to say that they allow a certain signal. | ||
3071 | * Must not be used if kthread was cloned with CLONE_SIGHAND. | ||
3072 | */ | ||
3073 | void allow_signal(int sig) | ||
3074 | { | ||
3075 | spin_lock_irq(¤t->sighand->siglock); | ||
3076 | /* This is only needed for daemonize()'ed kthreads */ | ||
3077 | sigdelset(¤t->blocked, sig); | ||
3078 | /* | ||
3079 | * Kernel threads handle their own signals. Let the signal code | ||
3080 | * know it'll be handled, so that they don't get converted to | ||
3081 | * SIGKILL or just silently dropped. | ||
3082 | */ | ||
3083 | current->sighand->action[(sig)-1].sa.sa_handler = (void __user *)2; | ||
3084 | recalc_sigpending(); | ||
3085 | spin_unlock_irq(¤t->sighand->siglock); | ||
3086 | } | ||
3087 | EXPORT_SYMBOL(allow_signal); | ||
3088 | |||
3089 | void disallow_signal(int sig) | ||
3090 | { | ||
3091 | spin_lock_irq(¤t->sighand->siglock); | ||
3092 | current->sighand->action[(sig)-1].sa.sa_handler = SIG_IGN; | ||
3093 | recalc_sigpending(); | ||
3094 | spin_unlock_irq(¤t->sighand->siglock); | ||
3095 | } | ||
3096 | EXPORT_SYMBOL(disallow_signal); | ||
3097 | |||
3069 | int do_sigaction(int sig, struct k_sigaction *act, struct k_sigaction *oact) | 3098 | int do_sigaction(int sig, struct k_sigaction *act, struct k_sigaction *oact) |
3070 | { | 3099 | { |
3071 | struct task_struct *p = current, *t; | 3100 | struct task_struct *p = current, *t; |