From: "J. Bruce Fields" <bfields@fieldses.org>
To: Miklos Szeredi <mszeredi@suse.cz>
Cc: Al Viro <viro@zeniv.linux.org.uk>,
linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-nfs@vger.kernel.org, miklos@szeredi.hu
Subject: Re: [PATCH] dcache: fix d_splice_alias handling of aliases
Date: Wed, 15 Jan 2014 12:57:23 -0500 [thread overview]
Message-ID: <20140115175723.GA4596@fieldses.org> (raw)
In-Reply-To: <1389807296.16290.32.camel@tucsk.piliscsaba.szeredi.hu>
On Wed, Jan 15, 2014 at 06:34:56PM +0100, Miklos Szeredi wrote:
> On Wed, 2014-01-15 at 10:17 -0500, J. Bruce Fields wrote:
> > From: "J. Bruce Fields" <bfields@redhat.com>
> >
> > d_splice_alias can create duplicate directory aliases (in the !new
> > case), or (in the new case) d_move without holding appropriate locks.
>
> It can d_move, because the dentry is known to be disconnected, i.e. it
> doesn't have a parent for which we could obtain the lock.
DCACHE_DISCONNECTED doesn't mean that.
When you lookup a dentry by filehandle that dentry is initially marked
DCACHE_DISCONNECTED. It is cleared only after reconnect_path() has
verified that the dentry is reachable all the way from the root.
So !DCACHE_DISCONNECTED implies that the dentry is connected all the way
up to the root, but the converse is not true.
This has been a source of confusion, but it is explained in
Documentation/filesystems/nfs/Exporting. Recently I've cleaned up a few
odd uses of DCACHE_DISCONNECTED and rewritten reconnect_path(), partly
as an attempt to clarify the situation.
Let me know if any of that doesn't look right to you....
> > d_materialise_unique deals with both of these problems. (The latter
> > seems to be dealt by trylocks (see __d_unalias), which look like they
> > could cause spurious lookup failures--but that's at least better than
> > corrupting the dcache.)
> >
> > Signed-off-by: J. Bruce Fields <bfields@redhat.com>
> > ---
> > fs/dcache.c | 25 +------------------------
> > 1 file changed, 1 insertion(+), 24 deletions(-)
> >
> > Only lightly tested.... If this is right, then we can also just ditch
> > d_splice_alias completely, and clean up the various d_find_alias's.
> >
> > I think the only reason we have both d_splice_alias and
> > d_materialise_unique is that the former was written for exportable
> > filesystems and the latter for distributed filesystems.
> >
> > But we have at least one exportable filesystem (fuse) using
> > d_materialise_unique. And I doubt d_splice_alias was ever completely
> > correct even for on-disk filesystems.
> >
> > Am I missing some subtlety?
>
> One subtle difference is that for a non-directory d_splice_alias() will
> reconnect a DCACHE_DISCONNECTED dentry if one exists, while
> d_materialise_unique() will not.
Actually until f80de2cde10350b8d146e375ff8b634e72e6a827 "dcache: don't
clear DCACHE_DISCONNECTED too early", it was the reverse:
d_materialise_unique cleared DISCONNECTED and d_splice_alias (correctly)
did not.
The only place where it should be cleared is reconnect_path().
> Does this matter in practice? The small number of extra dentries
> probably does not matter.
Directories are assumed to have unique aliases. When they don't, the
kernel can deadlock or crash.
--b.
next prev parent reply other threads:[~2014-01-15 17:57 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-01-15 15:17 [PATCH] dcache: fix d_splice_alias handling of aliases J. Bruce Fields
2014-01-15 15:17 ` J. Bruce Fields
2014-01-15 17:34 ` Miklos Szeredi
2014-01-15 17:57 ` J. Bruce Fields [this message]
2014-01-15 18:25 ` Miklos Szeredi
2014-01-15 18:25 ` Miklos Szeredi
2014-01-16 15:41 ` J. Bruce Fields
2014-01-16 16:13 ` Miklos Szeredi
2014-01-16 16:13 ` Miklos Szeredi
2014-01-16 16:10 ` J. Bruce Fields
2014-01-16 16:10 ` J. Bruce Fields
2014-01-16 16:15 ` Steven Whitehouse
2014-01-16 16:44 ` J. Bruce Fields
2014-01-16 16:44 ` J. Bruce Fields
2014-01-16 16:54 ` Bob Peterson
2014-01-16 18:51 ` J. Bruce Fields
2014-01-17 10:04 ` Steven Whitehouse
2014-01-17 18:04 ` J. Bruce Fields
2014-01-17 12:17 ` Christoph Hellwig
2014-01-17 15:39 ` J. Bruce Fields
2014-01-17 15:39 ` J. Bruce Fields
2014-01-17 21:03 ` J. Bruce Fields
2014-01-17 21:03 ` J. Bruce Fields
2014-01-17 21:26 ` J. Bruce Fields
2014-01-17 21:26 ` J. Bruce Fields
2014-01-23 21:27 ` [PATCH] dcache: make d_splice_alias use d_materialise_unique J. Bruce Fields
2014-01-31 18:42 ` Al Viro
2014-01-31 19:47 ` J. Bruce Fields
2014-02-06 17:03 ` J. Bruce Fields
2014-02-06 17:03 ` J. Bruce Fields
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=20140115175723.GA4596@fieldses.org \
--to=bfields@fieldses.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=miklos@szeredi.hu \
--cc=mszeredi@suse.cz \
--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.