btrfs: avoid extra memory allocation when copying free space cache
At copy_free_space_cache(), we add a new entry to the block group's ctl before we free the entry from the temporary ctl. Adding a new entry requires the allocation of a new struct btrfs_free_space, so we can avoid a temporary extra allocation by freeing the entry from the temporary ctl before we add a new entry to the main ctl, which possibly also reduces the chances for a memory allocation failure in case of very high memory pressure. So just do that. Reviewed-by: Anand Jain <anand.jain@oracle.com> Signed-off-by: Filipe Manana <fdmanana@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
12df6a622e
commit
fbb2e654d8
|
@ -923,10 +923,12 @@ static int copy_free_space_cache(struct btrfs_block_group *block_group,
|
|||
while (!ret && (n = rb_first(&ctl->free_space_offset)) != NULL) {
|
||||
info = rb_entry(n, struct btrfs_free_space, offset_index);
|
||||
if (!info->bitmap) {
|
||||
const u64 offset = info->offset;
|
||||
const u64 bytes = info->bytes;
|
||||
|
||||
unlink_free_space(ctl, info, true);
|
||||
ret = btrfs_add_free_space(block_group, info->offset,
|
||||
info->bytes);
|
||||
kmem_cache_free(btrfs_free_space_cachep, info);
|
||||
ret = btrfs_add_free_space(block_group, offset, bytes);
|
||||
} else {
|
||||
u64 offset = info->offset;
|
||||
u64 bytes = ctl->unit;
|
||||
|
|
Loading…
Reference in New Issue