summaryrefslogtreecommitdiffstats
path: root/tools/testing
diff options
context:
space:
mode:
authorNaohiro Aota <naohiro.aota@wdc.com>2022-07-09 08:18:44 +0900
committerDavid Sterba <dsterba@suse.com>2022-07-25 17:45:41 +0200
commit393f646e34c18b85d0f41272bfcbd475ae3a0d34 (patch)
tree23622c4f439d24f4b311243fc33510750f0587aa /tools/testing
parentbb9950d3df7169a673c594d38fb74e241ed4fb2a (diff)
downloadlinux-stable-393f646e34c18b85d0f41272bfcbd475ae3a0d34.tar.gz
linux-stable-393f646e34c18b85d0f41272bfcbd475ae3a0d34.tar.bz2
linux-stable-393f646e34c18b85d0f41272bfcbd475ae3a0d34.zip
btrfs: zoned: finish least available block group on data bg allocation
When we run out of active zones and no sufficient space is left in any block groups, we need to finish one block group to make room to activate a new block group. However, we cannot do this for metadata block groups because we can cause a deadlock by waiting for a running transaction commit. So, do that only for a data block group. Furthermore, the block group to be finished has two requirements. First, the block group must not have reserved bytes left. Having reserved bytes means we have an allocated region but did not yet send bios for it. If that region is allocated by the thread calling btrfs_zone_finish(), it results in a deadlock. Second, the block group to be finished must not be a SYSTEM block group. Finishing a SYSTEM block group easily breaks further chunk allocation by nullifying the SYSTEM free space. In a certain case, we cannot find any zone finish candidate or btrfs_zone_finish() may fail. In that case, we fall back to split the allocation bytes and fill the last spaces left in the block groups. CC: stable@vger.kernel.org # 5.16+ Fixes: afba2bc036b0 ("btrfs: zoned: implement active zone tracking") Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'tools/testing')
0 files changed, 0 insertions, 0 deletions