• Linus Torvalds's avatar
    vfs: reimplement d_rcu_to_refcount() using lockref_get_or_lock() · 15570086
    Linus Torvalds authored
    This moves __d_rcu_to_refcount() from <linux/dcache.h> into fs/namei.c
    and re-implements it using the lockref infrastructure instead.  It also
    adds a lot of comments about what is actually going on, because turning
    a dentry that was looked up using RCU into a long-lived reference
    counted entry is one of the more subtle parts of the rcu walk.
    
    We also used to be _particularly_ subtle in unlazy_walk() where we
    re-validate both the dentry and its parent using the same sequence
    count.  We used to do it by nesting the locks and then verifying the
    sequence count just once.
    
    That was silly, because nested locking is expensive, but the sequence
    count check is not.  So this just re-validates the dentry and the parent
    separately, avoiding the nested locking, and making the lockref lookup
    possible.
    Acked-by: default avatarWaiman Long <waiman.long@hp.com>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    15570086
namei.c 103 KB