aboutsummaryrefslogtreecommitdiffstats
path: root/fs/dcache.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2010-05-21 16:11:04 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2010-05-21 18:31:12 -0400
commit13e3c5e5b9c67e59074d24e29f3ff794bb4dfef0 (patch)
tree18222526565a7fdf44aba30d2861c1f6b75516e3 /fs/dcache.c
parentd515e86e639890b33a09390d062b0831664f04a2 (diff)
clean DCACHE_CANT_MOUNT in d_delete()
We set the "it's dead, don't mount on it" flag _and_ do not remove it if we turn the damn thing negative and leave it around. And if it goes positive afterwards, well... Fortunately, there's only one place where that needs to be caught: only d_delete() can turn the sucker negative without immediately freeing it; all other places that can lead to ->d_iput() call are followed by unconditionally freeing struct dentry in question. So the fix is obvious: Addresses https://bugzilla.kernel.org/show_bug.cgi?id=16014 Reported-by: Adam Tkac <vonsch@gmail.com> Tested-by: Adam Tkac <vonsch@gmail.com> Cc: <stable@kernel.org> [2.6.34.x] Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/dcache.c')
-rw-r--r--fs/dcache.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/dcache.c b/fs/dcache.c
index f1358e5c3a59..2b6f09af13ab 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -1529,6 +1529,7 @@ void d_delete(struct dentry * dentry)
1529 spin_lock(&dentry->d_lock); 1529 spin_lock(&dentry->d_lock);
1530 isdir = S_ISDIR(dentry->d_inode->i_mode); 1530 isdir = S_ISDIR(dentry->d_inode->i_mode);
1531 if (atomic_read(&dentry->d_count) == 1) { 1531 if (atomic_read(&dentry->d_count) == 1) {
1532 dentry->d_flags &= ~DCACHE_CANT_MOUNT;
1532 dentry_iput(dentry); 1533 dentry_iput(dentry);
1533 fsnotify_nameremove(dentry, isdir); 1534 fsnotify_nameremove(dentry, isdir);
1534 return; 1535 return;