• Al Viro's avatar
    beginning of transition to parallel lookups - marking in-lookup dentries · 85c7f810
    Al Viro authored
    marked as such when (would be) parallel lookup is about to pass them
    to actual ->lookup(); unmarked when
    	* __d_add() is about to make it hashed, positive or not.
    	* __d_move() (from d_splice_alias(), directly or via
    __d_unalias()) puts a preexisting dentry in its place
    	* in caller of ->lookup() if it has escaped all of the
    above.  Bug (WARN_ON, actually) if it reaches the final dput()
    or d_instantiate() while still marked such.
    
    As the result, we are guaranteed that for as long as the flag is
    set, dentry will
    	* remain negative unhashed with positive refcount
    	* never have its ->d_alias looked at
    	* never have its ->d_lru looked at
    	* never have its ->d_parent and ->d_name changed
    
    Right now we have at most one such for any given parent directory.
    With parallel lookups that restriction will weaken to
    	* only exist when parent is locked shared
    	* at most one with given (parent,name) pair (comparison of
    names is according to ->d_compare())
    	* only exist when there's no hashed dentry with the same
    (parent,name)
    
    Transition will take the next several commits; unfortunately, we'll
    only be able to switch to rwsem at the end of this series.  The
    reason for not making it a single patch is to simplify review.
    
    New primitives: d_in_lookup() (a predicate checking if dentry is in
    the in-lookup state) and d_lookup_done() (tells the system that
    we are done with lookup and if it's still marked as in-lookup, it
    should cease to be such).
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    85c7f810
namei.c 115 KB