diff options
| author | Filipe Manana <fdmanana@suse.com> | 2025-03-13 14:00:52 +0000 | 
|---|---|---|
| committer | David Sterba <dsterba@suse.com> | 2025-03-18 20:35:54 +0100 | 
| commit | e48264e601b39df3c8c75f3e7ae896d15cbbebcc (patch) | |
| tree | 419deff31dca4b5f5095a9c86462677e363476b7 /fs | |
| parent | 9db9c7dd5b4e1d3205137a094805980082c37716 (diff) | |
btrfs: avoid unnecessary memory allocation and copy at overwrite_item()
There's no need to allocate memory and copy from both the destination and
source extent buffers to compare if the items are equal, we can instead
use memcmp_extent_buffer() which allows to do only one memory allocation
and copy instead of two.
So use memcmp_extent_buffer() instead of memcmp(), allowing us to avoid
one memory allocation, which can fail or be slow while under memory heavy
pressure, avoid the memory copying and reducing code.
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/btrfs/tree-log.c | 12 | 
1 files changed, 2 insertions, 10 deletions
| diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 2d23223f476b..91278cc83bd4 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c @@ -422,7 +422,6 @@ static int overwrite_item(struct btrfs_trans_handle *trans,  	if (ret == 0) {  		char *src_copy; -		char *dst_copy;  		u32 dst_size = btrfs_item_size(path->nodes[0],  						  path->slots[0]);  		if (dst_size != item_size) @@ -432,23 +431,16 @@ static int overwrite_item(struct btrfs_trans_handle *trans,  			btrfs_release_path(path);  			return 0;  		} -		dst_copy = kmalloc(item_size, GFP_NOFS);  		src_copy = kmalloc(item_size, GFP_NOFS); -		if (!dst_copy || !src_copy) { +		if (!src_copy) {  			btrfs_release_path(path); -			kfree(dst_copy); -			kfree(src_copy);  			return -ENOMEM;  		}  		read_extent_buffer(eb, src_copy, src_ptr, item_size); -  		dst_ptr = btrfs_item_ptr_offset(path->nodes[0], path->slots[0]); -		read_extent_buffer(path->nodes[0], dst_copy, dst_ptr, -				   item_size); -		ret = memcmp(dst_copy, src_copy, item_size); +		ret = memcmp_extent_buffer(path->nodes[0], src_copy, dst_ptr, item_size); -		kfree(dst_copy);  		kfree(src_copy);  		/*  		 * they have the same contents, just return, this saves | 
