aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/exit.c
diff options
context:
space:
mode:
authorJeff Garzik <jeff@garzik.org>2006-09-30 23:55:03 -0400
committerJeff Garzik <jeff@garzik.org>2006-09-30 23:55:03 -0400
commite993835441734c184d70d3716eed78a08eeb71c2 (patch)
tree583aa17813cdae1c4640e353f8c6df3f197e7548 /kernel/exit.c
parent360f654e7cda850034f3f6252a7a7cff3fa77356 (diff)
parent1bdfd554be94def718323659173517c5d4a69d25 (diff)
Merge branch 'master' into upstream
Diffstat (limited to 'kernel/exit.c')
-rw-r--r--kernel/exit.c40
1 files changed, 20 insertions, 20 deletions
diff --git a/kernel/exit.c b/kernel/exit.c
index d891883420f7..c189de2927ab 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -38,6 +38,7 @@
38#include <linux/pipe_fs_i.h> 38#include <linux/pipe_fs_i.h>
39#include <linux/audit.h> /* for audit_free() */ 39#include <linux/audit.h> /* for audit_free() */
40#include <linux/resource.h> 40#include <linux/resource.h>
41#include <linux/blkdev.h>
41 42
42#include <asm/uaccess.h> 43#include <asm/uaccess.h>
43#include <asm/unistd.h> 44#include <asm/unistd.h>
@@ -219,7 +220,7 @@ static int will_become_orphaned_pgrp(int pgrp, struct task_struct *ignored_task)
219 do_each_task_pid(pgrp, PIDTYPE_PGID, p) { 220 do_each_task_pid(pgrp, PIDTYPE_PGID, p) {
220 if (p == ignored_task 221 if (p == ignored_task
221 || p->exit_state 222 || p->exit_state
222 || p->real_parent->pid == 1) 223 || is_init(p->real_parent))
223 continue; 224 continue;
224 if (process_group(p->real_parent) != pgrp 225 if (process_group(p->real_parent) != pgrp
225 && p->real_parent->signal->session == p->signal->session) { 226 && p->real_parent->signal->session == p->signal->session) {
@@ -249,17 +250,6 @@ static int has_stopped_jobs(int pgrp)
249 do_each_task_pid(pgrp, PIDTYPE_PGID, p) { 250 do_each_task_pid(pgrp, PIDTYPE_PGID, p) {
250 if (p->state != TASK_STOPPED) 251 if (p->state != TASK_STOPPED)
251 continue; 252 continue;
252
253 /* If p is stopped by a debugger on a signal that won't
254 stop it, then don't count p as stopped. This isn't
255 perfect but it's a good approximation. */
256 if (unlikely (p->ptrace)
257 && p->exit_code != SIGSTOP
258 && p->exit_code != SIGTSTP
259 && p->exit_code != SIGTTOU
260 && p->exit_code != SIGTTIN)
261 continue;
262
263 retval = 1; 253 retval = 1;
264 break; 254 break;
265 } while_each_task_pid(pgrp, PIDTYPE_PGID, p); 255 } while_each_task_pid(pgrp, PIDTYPE_PGID, p);
@@ -292,9 +282,7 @@ static void reparent_to_init(void)
292 /* Set the exit signal to SIGCHLD so we signal init on exit */ 282 /* Set the exit signal to SIGCHLD so we signal init on exit */
293 current->exit_signal = SIGCHLD; 283 current->exit_signal = SIGCHLD;
294 284
295 if ((current->policy == SCHED_NORMAL || 285 if (!has_rt_policy(current) && (task_nice(current) < 0))
296 current->policy == SCHED_BATCH)
297 && (task_nice(current) < 0))
298 set_user_nice(current, 0); 286 set_user_nice(current, 0);
299 /* cpus_allowed? */ 287 /* cpus_allowed? */
300 /* rt_priority? */ 288 /* rt_priority? */
@@ -487,6 +475,18 @@ void fastcall put_files_struct(struct files_struct *files)
487 475
488EXPORT_SYMBOL(put_files_struct); 476EXPORT_SYMBOL(put_files_struct);
489 477
478void reset_files_struct(struct task_struct *tsk, struct files_struct *files)
479{
480 struct files_struct *old;
481
482 old = tsk->files;
483 task_lock(tsk);
484 tsk->files = files;
485 task_unlock(tsk);
486 put_files_struct(old);
487}
488EXPORT_SYMBOL(reset_files_struct);
489
490static inline void __exit_files(struct task_struct *tsk) 490static inline void __exit_files(struct task_struct *tsk)
491{ 491{
492 struct files_struct * files = tsk->files; 492 struct files_struct * files = tsk->files;
@@ -954,15 +954,15 @@ fastcall NORET_TYPE void do_exit(long code)
954 if (tsk->splice_pipe) 954 if (tsk->splice_pipe)
955 __free_pipe_info(tsk->splice_pipe); 955 __free_pipe_info(tsk->splice_pipe);
956 956
957 /* PF_DEAD causes final put_task_struct after we schedule. */
958 preempt_disable(); 957 preempt_disable();
959 BUG_ON(tsk->flags & PF_DEAD); 958 /* causes final put_task_struct in finish_task_switch(). */
960 tsk->flags |= PF_DEAD; 959 tsk->state = TASK_DEAD;
961 960
962 schedule(); 961 schedule();
963 BUG(); 962 BUG();
964 /* Avoid "noreturn function does return". */ 963 /* Avoid "noreturn function does return". */
965 for (;;) ; 964 for (;;)
965 cpu_relax(); /* For when BUG is null */
966} 966}
967 967
968EXPORT_SYMBOL_GPL(do_exit); 968EXPORT_SYMBOL_GPL(do_exit);
@@ -971,7 +971,7 @@ NORET_TYPE void complete_and_exit(struct completion *comp, long code)
971{ 971{
972 if (comp) 972 if (comp)
973 complete(comp); 973 complete(comp);
974 974
975 do_exit(code); 975 do_exit(code);
976} 976}
977 977