On Wed, Dec 09, 2020 at 03:24:03PM -0500, Steven Rostedt wrote: > From: Steven Rostedt (VMware) <rostedt@xxxxxxxxxxx> > > Running my yearly branch profiling code, it detected a 100% wrong branch > condition in name.c for lookup_fast(). The code in question has: > > status = d_revalidate(dentry, nd->flags); > if (likely(status > 0)) > return dentry; > if (unlazy_child(nd, dentry, seq)) > return ERR_PTR(-ECHILD); > if (unlikely(status == -ECHILD)) > /* we'd been told to redo it in non-rcu mode */ > status = d_revalidate(dentry, nd->flags); > > If the status of the d_revalidate() is greater than zero, then the function > finishes. Otherwise, if it is an "unlazy_child" it returns with -ECHILD. > After the above two checks, the status is compared to -ECHILD, as that is > what is returned if the original d_revalidate() needed to be done in a > non-rcu mode. > > Especially this path is called in a condition of: > > if (nd->flags & LOOKUP_RCU) { > > And most of the d_revalidate() functions have: > > if (flags & LOOKUP_RCU) > return -ECHILD; Umm... That depends upon the filesystem mix involved; said that, I'd rather drop that "unlikely"...