In case d_lookup() returns a dentry with d_inode == NULL, the dentry is not returned with dput(). This results in triggering a BUG() in shrink_dcache_for_umount_subtree():
BUG: Dentry ...{i=0,n=...} still in use (1) [unmount of fuse fuse] Reported-by: Justin Clift <jcl...@redhat.com> Signed-off-by: Niels de Vos <nde...@redhat.com> -- Reproducing the BUG() on kernels with fuse that support READDIRPLUS can be done with the GlusterFS tests: - http://www.gluster.org/community/documentation/index.php/Using_the_Gluster_Test_Framework After some stressing of the VFS and fuse mountpoints, bug-860663.t will hit the BUG(). It does not happen on running this test stand-alone. --- fs/fuse/dir.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index 0eda527..da67a15 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -1246,7 +1246,9 @@ static int fuse_direntplus_link(struct file *file, if (err) goto out; dput(dentry); - dentry = NULL; + } else if (dentry) { + /* this dentry does not have a d_inode, just drop it */ + dput(dentry); } dentry = d_alloc(parent, &name); -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/