btrfs: use memcmp_extent_buffer() at replay_one_extent()
authorFilipe Manana <fdmanana@suse.com>
Thu, 13 Mar 2025 16:31:17 +0000 (16:31 +0000)
committerDavid Sterba <dsterba@suse.com>
Tue, 18 Mar 2025 19:35:55 +0000 (20:35 +0100)
Instead of using memcmp(), which requires copying both file extent items
from each extent buffer into a local buffer, use memcmp_extent_buffer() so
that we only need to copy one of the file extent items and directly use
the extent buffer of the other file extent item for the comparison.

This reduces code size, saves one memory copy and reduces stack usage.

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/tree-log.c

index 889b388c370855b7d17938e2438a285c7bfafa4e..7e0339f5fb6b32c564dad0e6ee1e8b8a44873fb2 100644 (file)
@@ -688,25 +688,18 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans,
        if (ret == 0 &&
            (found_type == BTRFS_FILE_EXTENT_REG ||
             found_type == BTRFS_FILE_EXTENT_PREALLOC)) {
-               struct btrfs_file_extent_item cmp1;
-               struct btrfs_file_extent_item cmp2;
-               struct btrfs_file_extent_item *existing;
-               struct extent_buffer *leaf;
-
-               leaf = path->nodes[0];
-               existing = btrfs_item_ptr(leaf, path->slots[0],
-                                         struct btrfs_file_extent_item);
+               struct btrfs_file_extent_item existing;
+               unsigned long ptr;
 
-               read_extent_buffer(eb, &cmp1, (unsigned long)item,
-                                  sizeof(cmp1));
-               read_extent_buffer(leaf, &cmp2, (unsigned long)existing,
-                                  sizeof(cmp2));
+               ptr = btrfs_item_ptr_offset(path->nodes[0], path->slots[0]);
+               read_extent_buffer(path->nodes[0], &existing, ptr, sizeof(existing));
 
                /*
                 * we already have a pointer to this exact extent,
                 * we don't have to do anything
                 */
-               if (memcmp(&cmp1, &cmp2, sizeof(cmp1)) == 0) {
+               if (memcmp_extent_buffer(eb, &existing, (unsigned long)item,
+                                        sizeof(existing)) == 0) {
                        btrfs_release_path(path);
                        goto out;
                }