summaryrefslogtreecommitdiff
path: root/tools/perf/scripts/python/stackcollapse.py
diff options
context:
space:
mode:
authorBoris Burkov <boris@bur.io>2026-09-16 15:17:24 -0700
committerDavid Sterba <dsterba@suse.com>2026-10-12 19:16:21 +0200
commit3bb5ed05c1ead17a12456d77591c773e1032c16a (patch)
tree298b7a0367a1d6ce584ec5f966afc98dc96fab25 /tools/perf/scripts/python/stackcollapse.py
parentfa9194e3ebcbdc1ca16cc4faa99932569efb870b (diff)
downloadlinux-3bb5ed05c1ead17a12456d77591c773e1032c16a.tar.gz
linux-3bb5ed05c1ead17a12456d77591c773e1032c16a.zip
btrfs: keep unused block groups queued when a pass fails
Once any block_group sets ret!=0 in the main loop of btrfs_delete_unused_bgs(), the check if (ret || btrfs_mixed_space_info(space_info)) { btrfs_put_block_group(block_group); continue; } skips the rest of the unused bgs while unlinking them from fs_info->unused_bgs. There is no "level triggered" re-queueing of empty block groups onto fs_info->unused_bgs so it is possible to leak quite a bit of space this way and unless we happen to get a balance or re-use/re-empty one of these bgs, they are leaked for good, which can lead to a spurious enospc later. While I have observed such leaked blocked groups that are empty but not on the unused_bgs list on production systems, I have not observed that it is definitely due to this issue. I also reproduced this behavior by injecting an ENOSPC error from btrfs_start_trans_remove_block_group which can also fail with ENOMEM, so this feels like a legitimate injection point. To fix it, instead of checking ret in the loop, just break out of the loop when ret != 0. Also, link the bg to the retry list at the individual failure sites so that the failing bg is not leaked. Assisted-by: LLM (reproducer/error injection) Reviewed-by: Qu Wenruo <wqu@suse.com> Signed-off-by: Boris Burkov <boris@bur.io> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'tools/perf/scripts/python/stackcollapse.py')
0 files changed, 0 insertions, 0 deletions