d_prune_alias(): just lock the parent and call __dentry_kill()
authorAl Viro <viro@zeniv.linux.org.uk>
Fri, 30 May 2014 15:25:30 +0000 (11:25 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 9 Oct 2014 06:38:59 +0000 (02:38 -0400)
commit29355c3904e1765948c7721719a028b7eb5dfe1d
treeed3b5660e0df3f0c725d678fa80d4cff719a29cd
parentbbd5192412fdedbae00888316bfe350bf89d0458
d_prune_alias(): just lock the parent and call __dentry_kill()

The only reason for games with ->d_prune() was __d_drop(), which
was needed only to force dput() into killing the sucker off.

Note that lock_parent() can be called under ->i_lock and won't
drop it, so dentry is safe from somebody managing to kill it
under us - it won't happen while we are holding ->i_lock.

__dentry_kill() is called only with ->d_lockref.count being 0
(here and when picked from shrink list) or 1 (dput() and dropping
the ancestors in shrink_dentry_list()), so it will never be called
twice - the first thing it's doing is making ->d_lockref.count
negative and once that happens, nothing will increment it.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/dcache.c