diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/exit.c | 15 | ||||
| -rw-r--r-- | kernel/fork.c | 1 |
2 files changed, 16 insertions, 0 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index 58b05e3ef9f8..e3fdd078f449 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -29,13 +29,28 @@ int getrusage(struct task_struct *, int, struct rusage *); static inline void __unhash_process(struct task_struct *p) { + struct dentry *proc_dentry; write_lock_irq(&tasklist_lock); nr_threads--; unhash_pid(p); REMOVE_LINKS(p); list_del(&p->thread_group); p->pid = 0; + proc_dentry = p->proc_dentry; + if (unlikely(proc_dentry)) { + spin_lock(&dcache_lock); + if (!list_empty(&proc_dentry->d_hash)) { + dget_locked(proc_dentry); + list_del_init(&proc_dentry->d_hash); + } else + proc_dentry = NULL; + spin_unlock(&dcache_lock); + } write_unlock_irq(&tasklist_lock); + if (unlikely(proc_dentry)) { + shrink_dcache_parent(proc_dentry); + dput(proc_dentry); + } } static void release_task(struct task_struct * p) diff --git a/kernel/fork.c b/kernel/fork.c index d7a274cbec95..380c1bafe75c 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -665,6 +665,7 @@ int do_fork(unsigned long clone_flags, unsigned long stack_start, copy_flags(clone_flags, p); p->pid = get_pid(clone_flags); + p->proc_dentry = NULL; INIT_LIST_HEAD(&p->run_list); |
