• Christoph Hellwig's avatar
    xfs: simplify xfs_trans_iget · aa72a5cf
    Christoph Hellwig authored
    xfs_trans_iget is a wrapper for xfs_iget that adds the inode to the
    transaction after it is read.  Except when the inode already is in the
    inode cache, in which case it returns the existing locked inode with
    increment lock recursion counts.
    
    Now, no one in the tree every decrements these lock recursion counts,
    so any user of this gets a potential double unlock when both the original
    owner of the inode and the xfs_trans_iget caller unlock it.  When looking
    back in a git bisect in the historic XFS tree there was only one place
    that decremented these counts, xfs_trans_iput.  Introduced in commit
    ca25df7a840f426eb566d52667b6950b92bb84b5 by Adam Sweeney in 1993,
    and removed in commit 19f899a3ab155ff6a49c0c79b06f2f61059afaf3 by
    Steve Lord in 2003.  And as long as it didn't slip through git bisects
    cracks never actually used in that time frame.
    
    A quick audit of the callers of xfs_trans_iget shows that no caller
    really relies on this behaviour fortunately - xfs_ialloc allows this
    inode from disk so it must not be there before, and all the RT allocator
    routines only every add each RT bitmap inode once.
    
    In addition to removing lots of code and reducing the size of the inode
    item this patch also avoids the double inode cache lookup in each
    create/mkdir/mknod transaction.
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    Reviewed-by: default avatarAlex Elder <aelder@sgi.com>
    Signed-off-by: default avatarFelix Blyakher <felixb@sgi.com>
    aa72a5cf
xfs_inode.h 20.4 KB