diff options
author | Filipe Manana <fdmanana@suse.com> | 2020-04-07 11:38:49 +0100 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2020-04-08 19:11:19 +0200 |
commit | d611add48b717ae34f59e0f474bfa7a7d840c4c4 (patch) | |
tree | c0f923bb98b5b7f04e00cba98ea58ad75409902a /fs/btrfs/block-group.c | |
parent | 7af597433d435b56b7c5c8260dad6f979153957b (diff) | |
download | lwn-d611add48b717ae34f59e0f474bfa7a7d840c4c4.tar.gz lwn-d611add48b717ae34f59e0f474bfa7a7d840c4c4.zip |
btrfs: fix reclaim counter leak of space_info objects
Whenever we add a ticket to a space_info object we increment the object's
reclaim_size counter witht the ticket's bytes, and we decrement it with
the corresponding amount only when we are able to grant the requested
space to the ticket. When we are not able to grant the space to a ticket,
or when the ticket is removed due to a signal (e.g. an application has
received sigterm from the terminal) we never decrement the counter with
the corresponding bytes from the ticket. This leak can result in the
space reclaim code to later do much more work than necessary. So fix it
by decrementing the counter when those two cases happen as well.
Fixes: db161806dc5615 ("btrfs: account ticket size at add/delete time")
Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'fs/btrfs/block-group.c')
-rw-r--r-- | fs/btrfs/block-group.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c index 786849fcc319..47f66c6a7d7f 100644 --- a/fs/btrfs/block-group.c +++ b/fs/btrfs/block-group.c @@ -3370,6 +3370,7 @@ int btrfs_free_block_groups(struct btrfs_fs_info *info) space_info->bytes_reserved > 0 || space_info->bytes_may_use > 0)) btrfs_dump_space_info(info, space_info, 0, 0); + WARN_ON(space_info->reclaim_size > 0); list_del(&space_info->list); btrfs_sysfs_remove_space_info(space_info); } |