summaryrefslogtreecommitdiff
path: root/fs/proc/base.c
diff options
context:
space:
mode:
authorJan Blunck <j.blunck@tu-harburg.de>2005-03-07 17:48:44 -0800
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-03-07 17:48:44 -0800
commitcd67725a0cede85ca80348333efdd7063e3ebfb7 (patch)
treeb6a0ddb8df3bb31a58bcdd375aa8beab95c553f4 /fs/proc/base.c
parent02721572728cccd31b54d69e1dfb8124fa02407e (diff)
[PATCH] d_drop should use per dentry lock
d_drop() must use the dentry->d_lock spinlock. In some cases __d_drop() was used without holding the dentry->d_lock spinlock, too. This could end in a race with __d_lookup(). Signed-off-by: Jan Blunck <j.blunck@tu-harburg.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/proc/base.c')
-rw-r--r--fs/proc/base.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c
index b30ee97c308f..9ab35875845d 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -1630,11 +1630,15 @@ struct dentry *proc_pid_unhash(struct task_struct *p)
if (proc_dentry != NULL) {
spin_lock(&dcache_lock);
+ spin_lock(&proc_dentry->d_lock);
if (!d_unhashed(proc_dentry)) {
dget_locked(proc_dentry);
__d_drop(proc_dentry);
- } else
+ spin_unlock(&proc_dentry->d_lock);
+ } else {
+ spin_unlock(&proc_dentry->d_lock);
proc_dentry = NULL;
+ }
spin_unlock(&dcache_lock);
}
return proc_dentry;