Re: [PATCH RFC 1/3] fs: introduce helper d_path_fast()
From: Linus Torvalds <torvalds@linux-foundation.org>
Date: 2021-05-08 15:31:13
Also in:
linux-fsdevel, linux-s390, lkml
From: Linus Torvalds <torvalds@linux-foundation.org>
Date: 2021-05-08 15:31:13
Also in:
linux-fsdevel, linux-s390, lkml
On Sat, May 8, 2021 at 5:29 AM Jia He [off-list ref] wrote:
This helper is similar to d_path except for not taking seqlock/spinlock.
I see why you did it that way, but conditional locking is something we
really really try to avoid in the kernel.
It basically makes a lot of static tools unable to follow the locking
rules, and it makes it hard for people to se what's going on too.
So instead of passing a "bool need_lock" thing down, the way to do
these things is generally to extract the code inside the locked region
into a helper function of its own, and then you have
__unlocked_version(...)
{
.. do the actual work
}
locked_version(..)
{
take_lock(..)
retval = __unlocked_version(..);
release_lock(..);
return retval;
}
this prepend_path() case is a bit more complicated because there's two
layers of locking, but I think the pattern should still work fine.
In fact, I think it would clean up prepend_path() and make it more
legible to have the two layers of mount_lock / rename_lock be done in
callers with the restarting being done as a loop in the caller rather
than as "goto restart_*".
Linus