mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
xfs: fix multi-AG deadlock in xfs_bunmapi
commit 5b094d6dac upstream.
Just like in the allocator we must avoid touching multiple AGs out of
order when freeing blocks, as freeing still locks the AGF and can cause
the same AB-BA deadlocks as in the allocation path.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reported-by: Nikolay Borisov <n.borisov.lkml@gmail.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
81e27c94f9
commit
229980158f
@@ -5556,6 +5556,7 @@ __xfs_bunmapi(
|
||||
xfs_fsblock_t sum;
|
||||
xfs_filblks_t len = *rlen; /* length to unmap in file */
|
||||
xfs_fileoff_t max_len;
|
||||
xfs_agnumber_t prev_agno = NULLAGNUMBER, agno;
|
||||
|
||||
trace_xfs_bunmap(ip, bno, len, flags, _RET_IP_);
|
||||
|
||||
@@ -5658,6 +5659,17 @@ __xfs_bunmapi(
|
||||
ASSERT(ep != NULL);
|
||||
del = got;
|
||||
wasdel = isnullstartblock(del.br_startblock);
|
||||
|
||||
/*
|
||||
* Make sure we don't touch multiple AGF headers out of order
|
||||
* in a single transaction, as that could cause AB-BA deadlocks.
|
||||
*/
|
||||
if (!wasdel) {
|
||||
agno = XFS_FSB_TO_AGNO(mp, del.br_startblock);
|
||||
if (prev_agno != NULLAGNUMBER && prev_agno > agno)
|
||||
break;
|
||||
prev_agno = agno;
|
||||
}
|
||||
if (got.br_startoff < start) {
|
||||
del.br_startoff = start;
|
||||
del.br_blockcount -= start - got.br_startoff;
|
||||
|
||||
Reference in New Issue
Block a user