Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm...
[linux-2.6-microblaze.git] / kernel / exit.c
index 0b81b26..389a88c 100644 (file)
@@ -103,17 +103,8 @@ static void __exit_signal(struct task_struct *tsk)
 
 #ifdef CONFIG_POSIX_TIMERS
        posix_cpu_timers_exit(tsk);
-       if (group_dead) {
+       if (group_dead)
                posix_cpu_timers_exit_group(tsk);
-       } else {
-               /*
-                * This can only happen if the caller is de_thread().
-                * FIXME: this is the temporary hack, we should teach
-                * posix-cpu-timers to handle this case correctly.
-                */
-               if (unlikely(has_group_leader_pid(tsk)))
-                       posix_cpu_timers_exit_group(tsk);
-       }
 #endif
 
        if (group_dead) {
@@ -191,6 +182,7 @@ void put_task_struct_rcu_user(struct task_struct *task)
 void release_task(struct task_struct *p)
 {
        struct task_struct *leader;
+       struct pid *thread_pid;
        int zap_leader;
 repeat:
        /* don't need to get the RCU readlock here - the process is dead and
@@ -199,11 +191,11 @@ repeat:
        atomic_dec(&__task_cred(p)->user->processes);
        rcu_read_unlock();
 
-       proc_flush_task(p);
        cgroup_release(p);
 
        write_lock_irq(&tasklist_lock);
        ptrace_release_task(p);
+       thread_pid = get_pid(p->thread_pid);
        __exit_signal(p);
 
        /*
@@ -226,6 +218,7 @@ repeat:
        }
 
        write_unlock_irq(&tasklist_lock);
+       proc_flush_pid(thread_pid);
        release_thread(p);
        put_task_struct_rcu_user(p);
 
@@ -258,6 +251,7 @@ void rcuwait_wake_up(struct rcuwait *w)
                wake_up_process(task);
        rcu_read_unlock();
 }
+EXPORT_SYMBOL_GPL(rcuwait_wake_up);
 
 /*
  * Determine if a process group is "orphaned", according to the POSIX