From: Manfred Spraul <manfred@colorfullife.com>

What about the attached patch?

The lifetime of dentries is quite long, thus I'd prefer if the race 
between proc_pid_lookup and sys_exit is closed.



 fs/proc/base.c |   15 +++++++++++----
 1 files changed, 11 insertions(+), 4 deletions(-)

diff -puN fs/proc/base.c~proc_pid_lookup-vs-exit-race-fix fs/proc/base.c
--- 25/fs/proc/base.c~proc_pid_lookup-vs-exit-race-fix	2003-10-26 15:50:11.000000000 -0800
+++ 25-akpm/fs/proc/base.c	2003-10-26 15:50:11.000000000 -0800
@@ -1524,6 +1524,7 @@ struct dentry *proc_pid_lookup(struct in
 	struct inode *inode;
 	struct proc_inode *ei;
 	unsigned tgid;
+	int died;
 
 	if (dentry->d_name.len == 4 && !memcmp(dentry->d_name.name,"self",4)) {
 		inode = new_inode(dir->i_sb);
@@ -1567,12 +1568,21 @@ struct dentry *proc_pid_lookup(struct in
 
 	dentry->d_op = &pid_base_dentry_operations;
 
+	died = 0;
+	d_add(dentry, inode);
 	spin_lock(&task->proc_lock);
 	task->proc_dentry = dentry;
-	d_add(dentry, inode);
+	if (!pid_alive(task)) {
+		dentry = proc_pid_unhash(task);
+		died = 1;
+	}
 	spin_unlock(&task->proc_lock);
 
 	put_task_struct(task);
+	if (died) {
+		proc_pid_flush(dentry);
+		goto out;
+	}
 	return NULL;
 out:
 	return ERR_PTR(-ENOENT);
@@ -1612,10 +1622,7 @@ static struct dentry *proc_task_lookup(s
 
 	dentry->d_op = &pid_base_dentry_operations;
 
-	spin_lock(&task->proc_lock);
-	task->proc_dentry = dentry;
 	d_add(dentry, inode);
-	spin_unlock(&task->proc_lock);
 
 	put_task_struct(task);
 	return NULL;

_