]> git.ipfire.org Git - thirdparty/kernel/linux.git/commit
btrfs: don't allow log trees to consume global reserve or overcommit metadata
authorFilipe Manana <fdmanana@suse.com>
Mon, 2 Feb 2026 16:35:01 +0000 (16:35 +0000)
committerDavid Sterba <dsterba@suse.com>
Tue, 7 Apr 2026 16:55:53 +0000 (18:55 +0200)
commit40f2b11c1b7c593bbbfbf6bf333228ee53ed4050
treed966e3101616e8121a1803e5631db1b97b8a9f87
parent574d93fc62e2b03ab39c8f92fb44ded89ca6274d
btrfs: don't allow log trees to consume global reserve or overcommit metadata

For a fsync we never reserve space in advance, we just start a transaction
without reserving space and we use an empty block reserve for a log tree.
We reserve space as we need while updating a log tree, we end up in
btrfs_use_block_rsv() when reserving space for the allocation of a log
tree extent buffer and we attempt first to reserve without flushing,
and if that fails we attempt to consume from the global reserve or
overcommit metadata. This makes us consume space that may be the last
resort for a transaction commit to succeed, therefore increasing the
chances for a transaction abort with -ENOSPC.

So make btrfs_use_block_rsv() fail if we can't reserve metadata space for
a log tree extent buffer allocation without flushing, making the fsync
fallback to a transaction commit and avoid using critical space that could
be the only resort for a transaction commit to succeed when we are in a
critical space situation.

Reviewed-by: Leo Martins <loemra.dev@gmail.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/block-rsv.c