On Sat, May 8, 2021 at 5:29 AM Jia He <justin.he@xxxxxxx> 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