mirror of
https://github.com/kdave/btrfs-progs
synced 2024-12-26 16:12:34 +00:00
e79f18a4a7
Unlike kernel, in btrfs-progs btrfs_start_transaction() never checks if there is enough metadata space. This can lead to very dangerous situation where there is no metadata space left at all, deadlocking future tree operations. This patch introduces a very basic version of metadata/system free space check by: - Check if there is enough metadata/system space left If there is enough, go as usual. - If there is not enough space left, try allocating a new chunk - Recheck if the new space can meet our demand If not, return ERR_PTR(-ENOSPC). Otherwise, allocate a new trans handle to the caller. This is possible thanks to the simplified transaction model in btrfs-progs: - We don't allow joining a transaction This means we don't need to handle complex cases like data ordered extents, which need to reserve space first, then join the current transaction and use the reserved blocks. - We don't allow multiple transaction handles for one transaction Since btrfs-progs is single threaded, we always start a transaction and then commit it. However there is a feature that must be an exception for the new metadata/system free space check: - btrfs check --init-extent-tree As all the meta/system free space check is based on the space info, which is loaded from block group items. Thus when rebuilding extent tree, we can no longer have an accurate view, thus we have to disable the feature for the whole execution if we're rebuilding the extent tree. For now, there is no regression exposed during the self tests, but I really hope this can be an extra safety net to prevent causing ENOSPC deadlock in btrfs-progs. Signed-off-by: Qu Wenruo <wqu@suse.com> Signed-off-by: David Sterba <dsterba@suse.com> |
||
---|---|---|
.. | ||
common.h | ||
main.c | ||
mode-common.c | ||
mode-common.h | ||
mode-lowmem.c | ||
mode-lowmem.h | ||
mode-original.h | ||
qgroup-verify.c | ||
qgroup-verify.h | ||
repair.c | ||
repair.h |