Re: [PATCH v3 00/24] Convert vfs.txt to vfs.rst

From: Al Viro
Date: Tue Apr 02 2019 - 12:50:40 EST


On Tue, Apr 02, 2019 at 09:49:34AM -0600, Jonathan Corbet wrote:
> On Wed, 27 Mar 2019 16:16:53 +1100
> "Tobin C. Harding" <tobin@xxxxxxxxxx> wrote:
>
> > Hi Al,
> >
> > This series converts the VFS file Documentation/filesystems/vfs.txt to
> > reStructuredText format. Please consider taking this series through
> > your tree as apposed to Jon's tree because this set makes a fair amount
> > of changes to VFS files (and also the VFS tree and docs tree are out of
> > sync right now with the recent work by Mauro and Neil).
>
> Al, do you have any thoughts on how you want to handle this? I was about
> to apply Jeff Layton's vfs.txt update, but would rather not create
> conflicts unnecessarily. Let me know if you'd like me to pick this work
> up.

Frankly, I would rather see that file be eventually replaced by something
saner, and I'm not talking about the format. Re Jeff's patch...

+ d_prune: called prior to pruning (i.e. unhashing and killing) a hashed
+ dentry from the dcache.

is flat-out misguiding. First of all, it *is* called for unhashed dentries,
TYVM. Furthermore, "prior to" is far too vague.

What really happens: there's a point in state diagram for dentries where
we commit to destroying a dentry and start taking it apart. That transition
happens with ->d_lock of dentry, ->i_lock of its inode (if any) and
->d_lock of the parent (again, if any) held; ->d_prune() is the last
chance for filesystem to see the (now doomed) dentry still intact.

It doesn't matter whether it's hashed or not, etc. The locks held
are sufficient to stabilize pretty much everything[1] in dentry and
nothing is destroyed yet. The only apparent exception is ->d_count,
but that's not real - we are guaranteed that there had been no other
counted references to dentry at the decision point and that none
could've been added. So this "oh, it's not 0 now, it's gone negative
after lockref_mark_dead() the caller has just done" is a red herring.

->d_prune() must not drop/regain any of the locks held by caller.
It must _not_ free anything attached to dentry - that belongs
later in the shutdown sequence. If anything, I'm tempted to
make it take const struct dentry * as argument, just to make
that clear.

No new (counted) references can be acquired by that point;
lockless dcache lookup might find our dentry a match, but
result of such lookup is not going to be legitimized - it's
doomed to be thrown out as stale.

It really makes more sense as part of struct dentry lifecycle
description...

[1] in theory, ->d_time might be changed by overlapping lockless
call of ->d_revalidate(). Up to filesystem - VFS doesn't touch
that field (and AFAICS only NFS uses it these days).