• Darrick J. Wong's avatar
    xfs: avoid ABBA deadlock when scrubbing parent pointers · ddd10c2f
    Darrick J. Wong authored
    In normal operation, the XFS convention is to take an inode's iolock
    and then allocate a transaction.  However, when scrubbing parent inodes
    this is inverted -- we allocated the transaction to do the scrub, and
    now we're trying to grab the parent's iolock.  This can lead to ABBA
    deadlocks: some thread grabbed the parent's iolock and is waiting for
    space for a transaction while our parent scrubber is sitting on a
    transaction trying to get the parent's iolock.
    
    Therefore, convert all iolock attempts to use trylock; if that fails,
    they can use the existing mechanisms to back off and try again.
    
    The ABBA deadlock didn't happen with a non-repair scrub because the
    transactions don't reserve any space, but repair scrubs require
    reservation in order to update metadata.  However, any other concurrent
    metadata update (e.g. directory create in the parent) could also induce
    this deadlock with the parent scrubber.
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
    ddd10c2f
common.c 21.5 KB