GIT: unionfs2-2.6.27.y: nfs d_revalidate() is too trigger-happy with d_drop()
Erez Zadok
ezk at fsl.cs.sunysb.edu
Thu Aug 12 23:15:22 EDT 2010
commit 5ea176dcda8200cce3ca9e208fba5ab49ebb786d
Author: Al Viro <viro at ZenIV.linux.org.uk>
Date: Thu Apr 29 03:10:43 2010 +0100
nfs d_revalidate() is too trigger-happy with d_drop()
commit d9e80b7de91db05c1c4d2e5ebbfd70b3b3ba0e0f upstream.
If dentry found stale happens to be a root of disconnected tree, we
can't d_drop() it; its d_hash is actually part of s_anon and d_drop()
would simply hide it from shrink_dcache_for_umount(), leading to
all sorts of fun, including busy inodes on umount and oopsen after
that.
Bug had been there since at least 2006 (commit c636eb already has it),
so it's definitely -stable fodder.
Signed-off-by: Al Viro <viro at zeniv.linux.org.uk>
Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh at suse.de>
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index e195f67..ee7ed21 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -826,6 +826,8 @@ out_zap_parent:
/* If we have submounts, don't unhash ! */
if (have_submounts(dentry))
goto out_valid;
+ if (dentry->d_flags & DCACHE_DISCONNECTED)
+ goto out_valid;
shrink_dcache_parent(dentry);
}
d_drop(dentry);
More information about the unionfs-cvs
mailing list