]> git.baikalelectronics.ru Git - kernel.git/commit
btrfs: allow use of global block reserve for balance item deletion
authorDavid Sterba <dsterba@suse.com>
Thu, 25 Jun 2020 10:35:28 +0000 (12:35 +0200)
committerDavid Sterba <dsterba@suse.com>
Mon, 27 Jul 2020 10:55:29 +0000 (12:55 +0200)
commite20d788c4a8169b239cc79e7c1cfff0aecd8b171
tree065a50f40d8544aa934b37972746c7e0aba65c41
parent827c12a97b23a9ede5a5549c954fff0e64f0bfee
btrfs: allow use of global block reserve for balance item deletion

On a filesystem with exhausted metadata, but still enough to start
balance, it's possible to hit this error:

[324402.053842] BTRFS info (device loop0): 1 enospc errors during balance
[324402.060769] BTRFS info (device loop0): balance: ended with status: -28
[324402.172295] BTRFS: error (device loop0) in reset_balance_state:3321: errno=-28 No space left

It fails inside reset_balance_state and turns the filesystem to
read-only, which is unnecessary and should be fixed too, but the problem
is caused by lack for space when the balance item is deleted. This is a
one-time operation and from the same rank as unlink that is allowed to
use the global block reserve. So do the same for the balance item.

Status of the filesystem (100GiB) just after the balance fails:

$ btrfs fi df mnt
Data, single: total=80.01GiB, used=38.58GiB
System, single: total=4.00MiB, used=16.00KiB
Metadata, single: total=19.99GiB, used=19.48GiB
GlobalReserve, single: total=512.00MiB, used=50.11MiB

CC: stable@vger.kernel.org # 4.4+
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/volumes.c