All of lore.kernel.org
 help / color / mirror / Atom feed
From: "J. Bruce Fields" <bfields@fieldses.org>
To: NeilBrown <neilb@suse.de>
Cc: Al Viro <viro@ZenIV.linux.org.uk>,
	Nick Piggin <npiggin@gmail.com>, Nick Piggin <npiggin@kernel.dk>,
	linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH] fs/dcache: allow __d_obtain_alias() to return unhashed dentries
Date: Wed, 29 Feb 2012 18:10:30 -0500	[thread overview]
Message-ID: <20120229231030.GC6506@fieldses.org> (raw)
In-Reply-To: <20120220135537.3078e20b@notabene.brown>

On Mon, Feb 20, 2012 at 01:55:37PM +1100, NeilBrown wrote:
> On Thu, 16 Feb 2012 17:30:11 -0500 "J. Bruce Fields" <bfields@fieldses.org>
> wrote:
> 
> > On Thu, Feb 16, 2012 at 02:06:03PM +1100, NeilBrown wrote:
> > > I was going ask how you managed to get an 'unhashed' dentry which was not
> > > DISCONNECTED, and belonged to a directory that could be the subject of
> > > d_splice_alias (that implies it has a name).
> > > 
> > > The bug sounds like a race between lookup and rmdir, which should be
> > > prevented by i_mutex.
> > > 
> > > I think that using __d_find_any_alias would just be papering over the
> > > problem, and would trigger a BUG_ON when it returned a non-DISCONNECTED alias.
> > 
> > Looking through the latest upstream code, I can't come up with another
> > obvious reproducer.
> > 
> > But I also can't see the code making any particular effort to ensure
> > that dentries are removed from inode's alias lists at the same time
> > they're unhashed.
> > 
> > E.g., trace up through the callers of d_drop/__d_drop and try to
> > convince yourselves that they all end up removing the dentry from the
> > alias list.
> > 
> > Can you see any reason why the following would actually create a
> > problem?
> 
> No, I don't think that would cause problems, so it is probably a good clean
> up and as Peng says it means we can remove the want_discon arg as well.
> 
> However I cannot help thinking that something else must be going wrong before
> we get to this point.
> When you rmdir a directory it must be empty and it will never be linked again.
> So how does 'lookup' find the inode and want to attach a dentry to it?
> 
> So I still think this is just papering over some other problem.
> 
> I think that looking at when aliases are removed is missing the point.
> 
> A directory can only have one name so it can only have one dentry.
> If that dentry gets unhashed, that is because the directory was deleted.

Wait, what other reasons could cause them to get unhashed?:

Just grepping for callers of d_drop....

On a distributed filesystem, we may unhash an in-use dentry if it no
longer seems to be valid.  Can something like this happen?

	- nfsd holds a filehandle for directory a/b
	- a/b is renamed to c/d by some other host using this
	  filesystem.
	- filesystem looks up a/b, finds it no longer there, unhashes
	  it.
	- a lookup for c/d later adds a new dentry.

And then we have two dentries?

And of course we unhash dentries when they're not in use, just to free
memory.  I think that case is OK.

--b.

> So
> now it must have zero names.  So there is no way that lookup can possibly
> find it, so there is no way that d_splice_alias can be asked to attach an
> alias to it.

WARNING: multiple messages have this Message-ID (diff)
From: "J. Bruce Fields" <bfields-uC3wQj2KruNg9hUCZPvPmw@public.gmane.org>
To: NeilBrown <neilb-l3A5Bk7waGM@public.gmane.org>
Cc: Al Viro <viro-3bDd1+5oDREiFSDQTTA3OLVCufUGDwFn@public.gmane.org>,
	Nick Piggin <npiggin-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	Nick Piggin <npiggin-tSWWG44O7X1aa/9Udqfwiw@public.gmane.org>,
	linux-nfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-fsdevel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH] fs/dcache: allow __d_obtain_alias() to return unhashed dentries
Date: Wed, 29 Feb 2012 18:10:30 -0500	[thread overview]
Message-ID: <20120229231030.GC6506@fieldses.org> (raw)
In-Reply-To: <20120220135537.3078e20b-wvvUuzkyo1EYVZTmpyfIwg@public.gmane.org>

On Mon, Feb 20, 2012 at 01:55:37PM +1100, NeilBrown wrote:
> On Thu, 16 Feb 2012 17:30:11 -0500 "J. Bruce Fields" <bfields-uC3wQj2KruNg9hUCZPvPmw@public.gmane.org>
> wrote:
> 
> > On Thu, Feb 16, 2012 at 02:06:03PM +1100, NeilBrown wrote:
> > > I was going ask how you managed to get an 'unhashed' dentry which was not
> > > DISCONNECTED, and belonged to a directory that could be the subject of
> > > d_splice_alias (that implies it has a name).
> > > 
> > > The bug sounds like a race between lookup and rmdir, which should be
> > > prevented by i_mutex.
> > > 
> > > I think that using __d_find_any_alias would just be papering over the
> > > problem, and would trigger a BUG_ON when it returned a non-DISCONNECTED alias.
> > 
> > Looking through the latest upstream code, I can't come up with another
> > obvious reproducer.
> > 
> > But I also can't see the code making any particular effort to ensure
> > that dentries are removed from inode's alias lists at the same time
> > they're unhashed.
> > 
> > E.g., trace up through the callers of d_drop/__d_drop and try to
> > convince yourselves that they all end up removing the dentry from the
> > alias list.
> > 
> > Can you see any reason why the following would actually create a
> > problem?
> 
> No, I don't think that would cause problems, so it is probably a good clean
> up and as Peng says it means we can remove the want_discon arg as well.
> 
> However I cannot help thinking that something else must be going wrong before
> we get to this point.
> When you rmdir a directory it must be empty and it will never be linked again.
> So how does 'lookup' find the inode and want to attach a dentry to it?
> 
> So I still think this is just papering over some other problem.
> 
> I think that looking at when aliases are removed is missing the point.
> 
> A directory can only have one name so it can only have one dentry.
> If that dentry gets unhashed, that is because the directory was deleted.

Wait, what other reasons could cause them to get unhashed?:

Just grepping for callers of d_drop....

On a distributed filesystem, we may unhash an in-use dentry if it no
longer seems to be valid.  Can something like this happen?

	- nfsd holds a filehandle for directory a/b
	- a/b is renamed to c/d by some other host using this
	  filesystem.
	- filesystem looks up a/b, finds it no longer there, unhashes
	  it.
	- a lookup for c/d later adds a new dentry.

And then we have two dentries?

And of course we unhash dentries when they're not in use, just to free
memory.  I think that case is OK.

--b.

> So
> now it must have zero names.  So there is no way that lookup can possibly
> find it, so there is no way that d_splice_alias can be asked to attach an
> alias to it.
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

  reply	other threads:[~2012-02-29 23:10 UTC|newest]

Thread overview: 73+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-11-12 18:43 lifetime of DCACHE_DISCONECTED dentries J. Bruce Fields
2010-11-13 11:53 ` Nick Piggin
2010-11-13 11:53   ` Nick Piggin
2010-11-15 17:48   ` J. Bruce Fields
2010-11-15 17:48     ` J. Bruce Fields
2010-11-16  6:45     ` Nick Piggin
2010-11-16  6:45       ` Nick Piggin
2010-11-29  3:56       ` Nick Piggin
2010-11-29  3:56         ` Nick Piggin
2010-11-29 19:32         ` J. Bruce Fields
2010-11-29 19:32           ` J. Bruce Fields
2010-11-30  1:00           ` Nick Piggin
2010-11-30  1:00             ` Nick Piggin
2010-11-30 18:39             ` J. Bruce Fields
2010-11-30 18:39               ` J. Bruce Fields
2010-12-03 22:33             ` [PATCH] nfsd4: allow __d_obtain_alias() to return unhashed dentries J. Bruce Fields
2010-12-03 22:33               ` J. Bruce Fields
2010-12-13  5:19               ` Nick Piggin
2010-12-13  5:19                 ` Nick Piggin
2010-12-14 22:01                 ` J. Bruce Fields
2010-12-14 22:01                   ` J. Bruce Fields
2010-12-17 17:53                   ` [PATCH] fs/dcache: use standard list macro for d_find_alias J. Bruce Fields
2010-12-17 17:53                     ` J. Bruce Fields
2010-12-17 18:00                   ` [PATCH 2/2] fs/dcache: allow __d_obtain_alias() to return unhashed dentries J. Bruce Fields
2010-12-17 18:00                     ` J. Bruce Fields
2010-12-18  2:01                     ` Nick Piggin
2010-12-18  2:01                       ` Nick Piggin
2010-12-18 16:16                       ` J. Bruce Fields
2010-12-18 16:16                         ` J. Bruce Fields
2010-12-19 14:53                         ` Nick Piggin
2010-12-19 14:53                           ` Nick Piggin
2010-12-27 23:46                           ` [PATCH] " J. Bruce Fields
2010-12-27 23:46                             ` J. Bruce Fields
2011-01-18 20:45                             ` J. Bruce Fields
2011-01-18 20:45                               ` J. Bruce Fields
2011-01-18 22:02                               ` Nick Piggin
2011-01-18 22:02                                 ` Nick Piggin
2011-01-18 22:08                                 ` J. Bruce Fields
2011-01-18 22:08                                   ` J. Bruce Fields
2011-03-08 18:13                                   ` J. Bruce Fields
2011-03-08 18:13                                     ` J. Bruce Fields
2011-03-10 10:58                                     ` Al Viro
2011-03-10 10:58                                       ` Al Viro
2011-03-11  4:07                                       ` NeilBrown
2011-03-11  4:07                                         ` NeilBrown
2012-02-14 17:03                                         ` J. Bruce Fields
2012-02-14 17:03                                           ` J. Bruce Fields
2012-02-15 16:56                                           ` J. Bruce Fields
2012-02-15 16:56                                             ` J. Bruce Fields
2012-02-16  3:06                                             ` NeilBrown
2012-02-16  3:06                                               ` NeilBrown
2012-02-16 11:51                                               ` J. Bruce Fields
2012-02-16 11:51                                                 ` J. Bruce Fields
2012-02-16 16:08                                                 ` J. Bruce Fields
2012-02-16 16:08                                                   ` J. Bruce Fields
2012-02-16 22:30                                               ` J. Bruce Fields
2012-02-17 16:34                                                 ` Peng Tao
2012-02-17 16:34                                                   ` Peng Tao
2012-03-13 20:55                                                   ` J. Bruce Fields
2012-03-13 20:55                                                     ` J. Bruce Fields
2012-03-13 20:58                                                     ` [PATCH 1/2] vfs: stop d_splice_alias creating directory aliases J. Bruce Fields
2012-03-13 20:58                                                     ` [PATCH 2/2] vfs: remove unused __d_splice_alias argument J. Bruce Fields
2012-02-20  2:55                                                 ` [PATCH] fs/dcache: allow __d_obtain_alias() to return unhashed dentries NeilBrown
2012-02-20  2:55                                                   ` NeilBrown
2012-02-29 23:10                                                   ` J. Bruce Fields [this message]
2012-02-29 23:10                                                     ` J. Bruce Fields
2012-06-28 13:59                                         ` J. Bruce Fields
2012-06-28 13:59                                           ` J. Bruce Fields
2012-06-29 20:10                                           ` J. Bruce Fields
2012-06-29 20:10                                             ` J. Bruce Fields
2012-06-29 20:29                                             ` J. Bruce Fields
2012-06-29 20:29                                               ` J. Bruce Fields
2012-07-01 23:15                                               ` NeilBrown

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=20120229231030.GC6506@fieldses.org \
    --to=bfields@fieldses.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=neilb@suse.de \
    --cc=npiggin@gmail.com \
    --cc=npiggin@kernel.dk \
    --cc=viro@ZenIV.linux.org.uk \
    /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.