summaryrefslogtreecommitdiffstats
path: root/kernel/locking/spinlock.c
diff options
context:
space:
mode:
authorDarrick J. Wong <darrick.wong@oracle.com>2018-05-14 15:34:34 +0200
committerDarrick J. Wong <darrick.wong@oracle.com>2018-05-16 03:12:50 +0200
commitddd10c2fe20e7ca6d11ddf84f905edba080b26a7 (patch)
tree4959baa41dc5019a27a59d55699a573cfe9afd21 /kernel/locking/spinlock.c
parentxfs: scrub the data fork of the realtime inodes (diff)
downloadlinux-ddd10c2fe20e7ca6d11ddf84f905edba080b26a7.tar.xz
linux-ddd10c2fe20e7ca6d11ddf84f905edba080b26a7.zip
xfs: avoid ABBA deadlock when scrubbing parent pointers
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: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Brian Foster <bfoster@redhat.com>
Diffstat (limited to 'kernel/locking/spinlock.c')
0 files changed, 0 insertions, 0 deletions