• Linus Torvalds's avatar
    vfs: use lockred "dead" flag to mark unrecoverably dead dentries · 0d98439e
    Linus Torvalds authored
    This simplifies the RCU to refcounting code in particular.
    
    I was originally intending to leave this for later, but walking through
    all the dput() logic (see previous commit), I realized that the dput()
    "might_sleep()" check was misleadingly weak.  And I removed it as
    misleading, both for performance profiling and for debugging.
    
    However, the might_sleep() debugging case is actually true: the final
    dput() can indeed sleep, if the inode of the dentry that you are
    releasing ends up sleeping at iput time (see dentry_iput()).  So the
    problem with the might_sleep() in dput() wasn't that it wasn't true, it
    was that it wasn't actually testing and triggering on the interesting
    case.
    
    In particular, just about *any* dput() can indeed sleep, if you happen
    to race with another thread deleting the file in question, and you then
    lose the race to the be the last dput() for that file.  But because it's
    a very rare race, the debugging code would never trigger it in practice.
    
    Why is this problematic? The new d_rcu_to_refcount() (see commit
    15570086: "vfs: reimplement d_rcu_to_refcount() using
    lockref_get_or_lock()") does a dput() for the failure case, and it does
    it under the RCU lock.  So potentially sleeping really is a bug.
    
    But there's no way I'm going to fix this with the previous complicated
    "lockref_get_or_lock()" interface.  And rather than revert to the old
    and crufty nested dentry locking code (which did get this right by
    delaying the reference count updates until they were verified to be
    safe), let's make forward progress.
    
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    0d98439e
namei.c 107 KB