• Al Viro's avatar
    new primitive: discard_new_inode() · c2b6d621
    Al Viro authored
    	We don't want open-by-handle picking half-set-up in-core
    struct inode from e.g. mkdir() having failed halfway through.
    In other words, we don't want such inodes returned by iget_locked()
    on their way to extinction.  However, we can't just have them
    unhashed - otherwise open-by-handle immediately *after* that would've
    ended up creating a new in-core inode over the on-disk one that
    is in process of being freed right under us.
    
    	Solution: new flag (I_CREATING) set by insert_inode_locked() and
    removed by unlock_new_inode() and a new primitive (discard_new_inode())
    to be used by such halfway-through-setup failure exits instead of
    unlock_new_inode() / iput() combinations.  That primitive unlocks new
    inode, but leaves I_CREATING in place.
    
    	iget_locked() treats finding an I_CREATING inode as failure
    (-ESTALE, once we sort out the error propagation).
    	insert_inode_locked() treats the same as instant -EBUSY.
    	ilookup() treats those as icache miss.
    
    [Fix by Dan Carpenter <dan.carpenter@oracle.com> folded in]
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    c2b6d621
dcache.c 82.6 KB