]> git.ipfire.org Git - thirdparty/linux.git/commit
Document rcu_read_lock() use in select_collect2()
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 11 Apr 2026 08:01:28 +0000 (04:01 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Fri, 5 Jun 2026 04:34:55 +0000 (00:34 -0400)
commita5beeb64f22662a53facd71ca2843f9d649597d6
treec00a9091d45f3f9248fe019cda9c104f75fef041
parentb4143e0e71cd660d05de8d2861e980e7c840eb39
Document rcu_read_lock() use in select_collect2()

If select_collect2() finds something that is neither busy nor can
be moved to shrink list, it needs to return that to caller's caller
(shrink_dcache_tree()) ASAP and do so without grabbing references (among
other things, it might be already dying, in which case refcount can't be
incremented).  We are called inside a ->d_lock scope, but that scope is
going to be terminated as soon as we return to caller (d_walk()); ->d_lock
will be retaken by shrink_dcache_tree(), but we need to bridge between
these scopes, turning them into contiguous RCU read-side critical area.

We do that with rcu_read_lock() scope - it spans from unbalanced
rcu_read_lock() in select_collect2() to unbalanced rcu_read_unlock()
in shrink_dcache_tree().  That works, but it really needs to be documented;
it's rather unidiomatic and it had caused quite a bit of confusion - some
of it in form of patches "fixing" the damn thing.

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