All of lore.kernel.org
 help / color / mirror / Atom feed
From: Brian Foster <bfoster@redhat.com>
To: Niels de Vos <ndevos@redhat.com>
Cc: Miklos Szeredi <miklos@szeredi.hu>,
	fuse-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org
Subject: Re: [fuse-devel] [PATCH] fuse: fix occasional dentry leak when readdirplus is used
Date: Mon, 15 Jul 2013 16:08:22 -0400	[thread overview]
Message-ID: <51E456B6.8050601@redhat.com> (raw)
In-Reply-To: <1373893160-30601-1-git-send-email-ndevos@redhat.com>

On 07/15/2013 08:59 AM, Niels de Vos wrote:
> 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 <jclift@redhat.com>
> Signed-off-by: Niels de Vos <ndevos@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.

Hi Neils,

FYI, this is fairly easy to reproduce on-demand with gluster:

- mount a volume to two local mountpoints (i.e., I used a single
storage/posix translator volume):
	glusterfs --volfile=./test.vol /mnt/{1,2} --use-readdirp=1
- create a negative dentry in one mountpoint:
	ls /mnt/1/file (results in ENOENT)
- create the file via the second mountpoint:
	touch /mnt/2/file
- run a readdirp on the first mountpoint:
	ls /mnt/1/
- umount /mnt/2 /mnt/1

> ---
>  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);
>  	}

I'm not really familiar with the dcache code, but is it appropriate to
also d_invalidate() the dentry in this case (as the previous code block
does)? Perhaps Miklos or somebody more familiar with dcache can confirm...

Brian

>  
>  	dentry = d_alloc(parent, &name);
> 


  reply	other threads:[~2013-07-15 20:04 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-15 12:59 [PATCH] fuse: fix occasional dentry leak when readdirplus is used Niels de Vos
2013-07-15 20:08 ` Brian Foster [this message]
2013-07-16 10:39   ` [fuse-devel] " Niels de Vos
2013-07-16 13:15     ` Brian Foster
2013-07-16 16:14       ` Miklos Szeredi
2013-07-16 17:43         ` Brian Foster
2013-07-17 11:20         ` Niels de Vos
2013-07-17 13:04           ` Miklos Szeredi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=51E456B6.8050601@redhat.com \
    --to=bfoster@redhat.com \
    --cc=fuse-devel@lists.sourceforge.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=miklos@szeredi.hu \
    --cc=ndevos@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.