From 5d52e7a5799c9843aef325e926a794638c48ad43 Mon Sep 17 00:00:00 2001 From: "Darrick J. Wong" Date: Fri, 15 Sep 2017 08:33:45 -0500 Subject: [PATCH] xfs_repair: take the ag_lock before recording rmap for a bmbt record When the (threaded) inode scanner iterates the blocks of a bmbt tree and wants to record the bmbt blocks in the in-core rmap database, we have to take the ag_lock for the AG that the bmbt block is in, or else we can accidentally corrupt the rmap slab by calling slab_add from two threads. Reported-by: matorola@gmail.com Signed-off-by: Darrick J. Wong Reviewed-by: Carlos Maiolino Signed-off-by: Eric Sandeen --- repair/scan.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/repair/scan.c b/repair/scan.c index 447611ac3..9c0f2d6a1 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -383,7 +383,10 @@ _("bad state %d, inode %" PRIu64 " bmap block 0x%" PRIx64 "\n"), /* Record BMBT blocks in the reverse-mapping data. */ if (check_dups && collect_rmaps) { + agno = XFS_FSB_TO_AGNO(mp, bno); + pthread_mutex_lock(&ag_locks[agno].lock); error = rmap_add_bmbt_rec(mp, ino, whichfork, bno); + pthread_mutex_unlock(&ag_locks[agno].lock); if (error) do_error( _("couldn't add inode %"PRIu64" bmbt block %"PRIu64" reverse-mapping data."), -- 2.47.3