• Al Viro's avatar
    untangle do_lookup() · 5a18fff2
    Al Viro authored
    That thing has devolved into rats nest of gotos; sane use of unlikely()
    gets rid of that horror and gives much more readable structure:
    	* make a fast attempt to find a dentry; false negatives are OK.
    In RCU mode if everything went fine, we are done, otherwise just drop
    out of RCU.  If we'd done (RCU) ->d_revalidate() and it had not refused
    outright (i.e. didn't give us -ECHILD), remember its result.
    	* now we are not in RCU mode and hopefully have a dentry.  If we
    do not, lock parent, do full d_lookup() and if that has not found anything,
    allocate and call ->lookup().  If we'd done that ->lookup(), remember that
    dentry is good and we don't need to revalidate it.
    	* now we have a dentry.  If it has ->d_revalidate() and we can't
    skip it, call it.
    	* hopefully dentry is good; if not, either fail (in case of error)
    or try to invalidate it.  If d_invalidate() has succeeded, drop it and
    retry everything as if original attempt had not found a dentry.
    	* now we can finish it up - deal with mountpoint crossing and
    automount.
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    5a18fff2
namei.c 82.5 KB