diff options
Diffstat (limited to 'kernel/fork.c')
-rw-r--r-- | kernel/fork.c | 20 |
1 files changed, 5 insertions, 15 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index 043b5d88049b..aab8579c6093 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -814,11 +814,8 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk) | |||
814 | { | 814 | { |
815 | struct signal_struct *sig; | 815 | struct signal_struct *sig; |
816 | 816 | ||
817 | if (clone_flags & CLONE_THREAD) { | 817 | if (clone_flags & CLONE_THREAD) |
818 | atomic_inc(¤t->signal->count); | ||
819 | atomic_inc(¤t->signal->live); | ||
820 | return 0; | 818 | return 0; |
821 | } | ||
822 | 819 | ||
823 | sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL); | 820 | sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL); |
824 | tsk->signal = sig; | 821 | tsk->signal = sig; |
@@ -876,16 +873,6 @@ void __cleanup_signal(struct signal_struct *sig) | |||
876 | kmem_cache_free(signal_cachep, sig); | 873 | kmem_cache_free(signal_cachep, sig); |
877 | } | 874 | } |
878 | 875 | ||
879 | static void cleanup_signal(struct task_struct *tsk) | ||
880 | { | ||
881 | struct signal_struct *sig = tsk->signal; | ||
882 | |||
883 | atomic_dec(&sig->live); | ||
884 | |||
885 | if (atomic_dec_and_test(&sig->count)) | ||
886 | __cleanup_signal(sig); | ||
887 | } | ||
888 | |||
889 | static void copy_flags(unsigned long clone_flags, struct task_struct *p) | 876 | static void copy_flags(unsigned long clone_flags, struct task_struct *p) |
890 | { | 877 | { |
891 | unsigned long new_flags = p->flags; | 878 | unsigned long new_flags = p->flags; |
@@ -1238,6 +1225,8 @@ static struct task_struct *copy_process(unsigned long clone_flags, | |||
1238 | } | 1225 | } |
1239 | 1226 | ||
1240 | if (clone_flags & CLONE_THREAD) { | 1227 | if (clone_flags & CLONE_THREAD) { |
1228 | atomic_inc(¤t->signal->count); | ||
1229 | atomic_inc(¤t->signal->live); | ||
1241 | p->group_leader = current->group_leader; | 1230 | p->group_leader = current->group_leader; |
1242 | list_add_tail_rcu(&p->thread_group, &p->group_leader->thread_group); | 1231 | list_add_tail_rcu(&p->thread_group, &p->group_leader->thread_group); |
1243 | } | 1232 | } |
@@ -1281,7 +1270,8 @@ bad_fork_cleanup_mm: | |||
1281 | if (p->mm) | 1270 | if (p->mm) |
1282 | mmput(p->mm); | 1271 | mmput(p->mm); |
1283 | bad_fork_cleanup_signal: | 1272 | bad_fork_cleanup_signal: |
1284 | cleanup_signal(p); | 1273 | if (!(clone_flags & CLONE_THREAD)) |
1274 | __cleanup_signal(p->signal); | ||
1285 | bad_fork_cleanup_sighand: | 1275 | bad_fork_cleanup_sighand: |
1286 | __cleanup_sighand(p->sighand); | 1276 | __cleanup_sighand(p->sighand); |
1287 | bad_fork_cleanup_fs: | 1277 | bad_fork_cleanup_fs: |