summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/exit.c15
-rw-r--r--kernel/fork.c1
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);