int level;
int should_reada = p->reada;
int lowest_unlock = 1;
+ int blocksize;
u8 lowest_level = 0;
+ u64 blocknr;
+ u64 gen;
lowest_level = p->lowest_level;
WARN_ON(lowest_level && ins_len);
reada_for_search(root, p, level, slot,
key->objectid);
- tmp = btrfs_find_tree_block(root,
- btrfs_node_blockptr(b, slot),
- btrfs_level_size(root, level - 1));
- if (tmp && btrfs_buffer_uptodate(tmp,
- btrfs_node_ptr_generation(b, slot))) {
+ blocknr = btrfs_node_blockptr(b, slot);
+ gen = btrfs_node_ptr_generation(b, slot);
+ blocksize = btrfs_level_size(root, level - 1);
+
+ tmp = btrfs_find_tree_block(root, blocknr, blocksize);
+ if (tmp && btrfs_buffer_uptodate(tmp, gen)) {
b = tmp;
} else {
/*
btrfs_release_path(NULL, p);
if (tmp)
free_extent_buffer(tmp);
+ tmp = read_tree_block(root, blocknr,
+ blocksize, gen);
+ if (tmp)
+ free_extent_buffer(tmp);
goto again;
} else {
b = read_node_slot(root, b, slot);