]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
btrfs: avoid extra memory allocation when copying free space cache
authorFilipe Manana <fdmanana@suse.com>
Thu, 4 May 2023 11:04:19 +0000 (12:04 +0100)
committerDavid Sterba <dsterba@suse.com>
Mon, 19 Jun 2023 11:59:23 +0000 (13:59 +0200)
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>
fs/btrfs/free-space-cache.c

index cf98a3c0548029ae041ba8032190f71bfbc22823..ec53119d4cfbc08d984b88e41e5d15d52d4b6cde 100644 (file)
@@ -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;