retain_dentry(): introduce a trimmed-down lockless variant
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 23 Nov 2023 22:33:21 +0000 (17:33 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 25 Nov 2023 07:35:20 +0000 (02:35 -0500)
commit6367b491c17a34b28aece294bddfda1a36ec0377
tree84a4d26c0d0536cc0b98bc3a292e07e8e342bcb3
parent1c18edd1b7a068e07fed7f00e059f22ed67c04c9
retain_dentry(): introduce a trimmed-down lockless variant

fast_dput() contains a small piece of code, preceded by scary
comments about 5 times longer than it. What is actually done there is
a trimmed-down subset of retain_dentry() - in some situations we can
tell that retain_dentry() would have returned true without ever needing
->d_lock and that's what that code checks.  If these checks come true
fast_dput() can declare that we are done, without bothering with ->d_lock;
otherwise it has to take the lock and do full variant of retain_dentry()
checks.

Trimmed-down variant of the checks is hard to follow and
it's asking for trouble - if we ever decide to change the rules in
retain_dentry(), we'll have to remember to update that code.  It turns
out that an equivalent variant of these checks more obviously parallel
to retain_dentry() is not just possible, but easy to unify with
retain_dentry() itself, passing it a new boolean argument ('locked')
to distinguish between the full semantics and trimmed down one.

Note that in lockless case true is returned only when locked
variant would have returned true without ever needing the lock; false
means "punt to the locking path and recheck there".

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