Name: Daemonize idle task Author: Rusty Russell Status: Tested on 2.5.9 D: This patch allows daemonize() to be called on another process (if D: not started yet), and calls it on the idle task. diff -urN -I \$.*\$ --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal working-2.5.14-dofork+clonepid/include/linux/sched.h tmp/include/linux/sched.h --- working-2.5.14-dofork+clonepid/include/linux/sched.h Thu May 9 18:25:21 2002 +++ tmp/include/linux/sched.h Thu May 9 18:36:17 2002 @@ -654,7 +654,12 @@ extern void exit_sighand(struct task_struct *); extern void reparent_to_init(void); -extern void daemonize(void); +extern void __daemonize(struct task_struct *); +static inline void daemonize(void) +{ + __daemonize(current); +} + extern task_t *child_reaper; extern int do_execve(char *, char **, char **, struct pt_regs *); diff -urN -I \$.*\$ --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal working-2.5.14-dofork+clonepid/kernel/exit.c tmp/kernel/exit.c --- working-2.5.14-dofork+clonepid/kernel/exit.c Mon Apr 29 16:00:29 2002 +++ tmp/kernel/exit.c Thu May 9 18:36:17 2002 @@ -201,32 +201,30 @@ * Put all the gunge required to become a kernel thread without * attached user resources in one place where it belongs. */ - -void daemonize(void) +void __daemonize(struct task_struct *tsk) { struct fs_struct *fs; - /* * If we were started as result of loading a module, close all of the * user space pages. We don't need them, and if we didn't close them * they would be locked into memory. */ - exit_mm(current); + exit_mm(tsk); - current->session = 1; - current->pgrp = 1; - current->tty = NULL; + tsk->session = 1; + tsk->pgrp = 1; + tsk->tty = NULL; /* Become as one with the init task */ - exit_fs(current); /* current->fs->count--; */ + exit_fs(tsk); /* current->fs->count--; */ fs = init_task.fs; - current->fs = fs; + tsk->fs = fs; atomic_inc(&fs->count); - exit_files(current); - current->files = init_task.files; - atomic_inc(¤t->files->count); + exit_files(tsk); + tsk->files = init_task.files; + atomic_inc(&tsk->files->count); } /* diff -urN -I \$.*\$ --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal working-2.5.14-dofork+clonepid/kernel/sched.c tmp/kernel/sched.c --- working-2.5.14-dofork+clonepid/kernel/sched.c Wed May 1 15:09:29 2002 +++ tmp/kernel/sched.c Thu May 9 18:45:17 2002 @@ -1555,6 +1555,8 @@ runqueue_t *idle_rq = cpu_rq(cpu), *rq = cpu_rq(idle->thread_info->cpu); unsigned long flags; + if (idle != &init_task) + __daemonize(idle); __save_flags(flags); __cli(); double_rq_lock(idle_rq, rq);