{
int slot;
int level = 1;
+ int offset = 1;
struct extent_buffer *c;
struct extent_buffer *next = NULL;
+again:
for (; level < BTRFS_MAX_LEVEL; level++) {
if (path->nodes[level])
break;
if (!path->nodes[level])
return 1;
- slot = path->slots[level] + 1;
+ slot = path->slots[level] + offset;
c = path->nodes[level];
if (slot >= btrfs_header_nritems(c)) {
level++;
reada_for_search(root, path, level, slot, 0);
next = read_node_slot(root, c, slot);
- break;
+ if (next)
+ break;
+ offset++;
}
path->slots[level] = slot;
while(1) {
if (path->reada)
reada_for_search(root, path, level, 0, 0);
next = read_node_slot(root, next, 0);
+ if (!next)
+ goto again;
}
return 0;
}
if (slot >= btrfs_header_nritems(parent))
return NULL;
- BUG_ON(level == 0);
+ if (level == 0)
+ return NULL;
return read_tree_block(root, btrfs_node_blockptr(parent, slot),
btrfs_level_size(root, level - 1),