keventd and friends are currently holding /dev/console open three times. It's all inherited from init. Steal the relevant parts of daemonize() to fix that up. --- 25-akpm/kernel/kthread.c | 18 ++++++++++++++++++ 1 files changed, 18 insertions(+) diff -puN kernel/kthread.c~kthread-keeps-files-open kernel/kthread.c --- 25/kernel/kthread.c~kthread-keeps-files-open 2004-03-14 14:49:21.679226616 -0800 +++ 25-akpm/kernel/kthread.c 2004-03-14 14:57:18.425750128 -0800 @@ -10,6 +10,7 @@ #include #include #include +#include #include struct kthread_create_info @@ -41,6 +42,21 @@ int kthread_should_stop(void) return (kthread_stop_info.k == current); } + +static void kthread_exit_files(void) +{ + struct fs_struct *fs; + struct task_struct *tsk = current; + + exit_fs(tsk); /* current->fs->count--; */ + fs = init_task.fs; + tsk->fs = fs; + atomic_inc(&fs->count); + exit_files(tsk); + current->files = init_task.files; + atomic_inc(&tsk->files->count); +} + static int kthread(void *_create) { struct kthread_create_info *create = _create; @@ -50,6 +66,8 @@ static int kthread(void *_create) int ret = -EINTR; cpumask_t mask = CPU_MASK_ALL; + kthread_exit_files(); + /* Copy data: it's on keventd's stack */ threadfn = create->threadfn; data = create->data; _