aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/ctree.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/ctree.c')
-rw-r--r--fs/btrfs/ctree.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
index 1b756fae2799..9601241e552b 100644
--- a/fs/btrfs/ctree.c
+++ b/fs/btrfs/ctree.c
@@ -1245,7 +1245,10 @@ int btrfs_search_slot(struct btrfs_trans_handle *trans, struct btrfs_root
1245 int level; 1245 int level;
1246 int should_reada = p->reada; 1246 int should_reada = p->reada;
1247 int lowest_unlock = 1; 1247 int lowest_unlock = 1;
1248 int blocksize;
1248 u8 lowest_level = 0; 1249 u8 lowest_level = 0;
1250 u64 blocknr;
1251 u64 gen;
1249 1252
1250 lowest_level = p->lowest_level; 1253 lowest_level = p->lowest_level;
1251 WARN_ON(lowest_level && ins_len); 1254 WARN_ON(lowest_level && ins_len);
@@ -1320,11 +1323,12 @@ again:
1320 reada_for_search(root, p, level, slot, 1323 reada_for_search(root, p, level, slot,
1321 key->objectid); 1324 key->objectid);
1322 1325
1323 tmp = btrfs_find_tree_block(root, 1326 blocknr = btrfs_node_blockptr(b, slot);
1324 btrfs_node_blockptr(b, slot), 1327 gen = btrfs_node_ptr_generation(b, slot);
1325 btrfs_level_size(root, level - 1)); 1328 blocksize = btrfs_level_size(root, level - 1);
1326 if (tmp && btrfs_buffer_uptodate(tmp, 1329
1327 btrfs_node_ptr_generation(b, slot))) { 1330 tmp = btrfs_find_tree_block(root, blocknr, blocksize);
1331 if (tmp && btrfs_buffer_uptodate(tmp, gen)) {
1328 b = tmp; 1332 b = tmp;
1329 } else { 1333 } else {
1330 /* 1334 /*
@@ -1336,6 +1340,10 @@ again:
1336 btrfs_release_path(NULL, p); 1340 btrfs_release_path(NULL, p);
1337 if (tmp) 1341 if (tmp)
1338 free_extent_buffer(tmp); 1342 free_extent_buffer(tmp);
1343 tmp = read_tree_block(root, blocknr,
1344 blocksize, gen);
1345 if (tmp)
1346 free_extent_buffer(tmp);
1339 goto again; 1347 goto again;
1340 } else { 1348 } else {
1341 b = read_node_slot(root, b, slot); 1349 b = read_node_slot(root, b, slot);