diff options
-rw-r--r-- | fs/exec.c | 14 | ||||
-rw-r--r-- | include/linux/sched.h | 1 | ||||
-rw-r--r-- | kernel/fork.c | 2 |
3 files changed, 3 insertions, 14 deletions
@@ -1926,19 +1926,9 @@ static int coredump_wait(int exit_code, struct core_state *core_state) | |||
1926 | core_waiters = zap_threads(tsk, mm, core_state, exit_code); | 1926 | core_waiters = zap_threads(tsk, mm, core_state, exit_code); |
1927 | up_write(&mm->mmap_sem); | 1927 | up_write(&mm->mmap_sem); |
1928 | 1928 | ||
1929 | if (unlikely(core_waiters < 0)) | 1929 | if (core_waiters > 0) |
1930 | goto fail; | ||
1931 | |||
1932 | /* | ||
1933 | * Make sure nobody is waiting for us to release the VM, | ||
1934 | * otherwise we can deadlock when we wait on each other | ||
1935 | */ | ||
1936 | if (tsk->vfork_done) | ||
1937 | complete_vfork_done(tsk); | ||
1938 | |||
1939 | if (core_waiters) | ||
1940 | wait_for_completion(&core_state->startup); | 1930 | wait_for_completion(&core_state->startup); |
1941 | fail: | 1931 | |
1942 | return core_waiters; | 1932 | return core_waiters; |
1943 | } | 1933 | } |
1944 | 1934 | ||
diff --git a/include/linux/sched.h b/include/linux/sched.h index b6467711f12e..11fcafaf4ae4 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -2291,7 +2291,6 @@ extern int do_execve(const char *, | |||
2291 | const char __user * const __user *, | 2291 | const char __user * const __user *, |
2292 | const char __user * const __user *, struct pt_regs *); | 2292 | const char __user * const __user *, struct pt_regs *); |
2293 | extern long do_fork(unsigned long, unsigned long, struct pt_regs *, unsigned long, int __user *, int __user *); | 2293 | extern long do_fork(unsigned long, unsigned long, struct pt_regs *, unsigned long, int __user *, int __user *); |
2294 | extern void complete_vfork_done(struct task_struct *tsk); | ||
2295 | struct task_struct *fork_idle(int); | 2294 | struct task_struct *fork_idle(int); |
2296 | 2295 | ||
2297 | extern void set_task_comm(struct task_struct *tsk, char *from); | 2296 | extern void set_task_comm(struct task_struct *tsk, char *from); |
diff --git a/kernel/fork.c b/kernel/fork.c index 892c534ce6e3..44b0e21af50e 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -668,7 +668,7 @@ struct mm_struct *mm_access(struct task_struct *task, unsigned int mode) | |||
668 | return mm; | 668 | return mm; |
669 | } | 669 | } |
670 | 670 | ||
671 | void complete_vfork_done(struct task_struct *tsk) | 671 | static void complete_vfork_done(struct task_struct *tsk) |
672 | { | 672 | { |
673 | struct completion *vfork; | 673 | struct completion *vfork; |
674 | 674 | ||