diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2021-11-27 10:27:35 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2021-11-27 10:27:35 -0800 |
commit | 52dc4c640ac5521cc95b3b87f9d2d276c12c07bb (patch) | |
tree | c91d85b793652b26057489ca94d98000ad8ff828 /fs | |
parent | 7b65b798a604aff77d5e744833b5d452d2081467 (diff) | |
parent | 57bbeacdbee72a54eb97d56b876cf9c94059fc34 (diff) | |
download | linux-52dc4c640ac5521cc95b3b87f9d2d276c12c07bb.tar.gz linux-52dc4c640ac5521cc95b3b87f9d2d276c12c07bb.tar.bz2 linux-52dc4c640ac5521cc95b3b87f9d2d276c12c07bb.zip |
Merge tag 'erofs-for-5.16-rc3-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs
Pull erofs fix from Gao Xiang:
"Fix an ABBA deadlock introduced by XArray conversion"
* tag 'erofs-for-5.16-rc3-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs:
erofs: fix deadlock when shrink erofs slab
Diffstat (limited to 'fs')
-rw-r--r-- | fs/erofs/utils.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/fs/erofs/utils.c b/fs/erofs/utils.c index 84da2c280012..ec9a1d780dc1 100644 --- a/fs/erofs/utils.c +++ b/fs/erofs/utils.c @@ -150,7 +150,7 @@ static bool erofs_try_to_release_workgroup(struct erofs_sb_info *sbi, * however in order to avoid some race conditions, add a * DBG_BUGON to observe this in advance. */ - DBG_BUGON(xa_erase(&sbi->managed_pslots, grp->index) != grp); + DBG_BUGON(__xa_erase(&sbi->managed_pslots, grp->index) != grp); /* last refcount should be connected with its managed pslot. */ erofs_workgroup_unfreeze(grp, 0); @@ -165,15 +165,19 @@ static unsigned long erofs_shrink_workstation(struct erofs_sb_info *sbi, unsigned int freed = 0; unsigned long index; + xa_lock(&sbi->managed_pslots); xa_for_each(&sbi->managed_pslots, index, grp) { /* try to shrink each valid workgroup */ if (!erofs_try_to_release_workgroup(sbi, grp)) continue; + xa_unlock(&sbi->managed_pslots); ++freed; if (!--nr_shrink) - break; + return freed; + xa_lock(&sbi->managed_pslots); } + xa_unlock(&sbi->managed_pslots); return freed; } |