From: Niels de V. <nd...@re...> - 2013-07-15 13:25:36
|
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 <jc...@re...> Signed-off-by: Niels de Vos <nd...@re...> -- 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 |