summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmds-restore.c10
-rw-r--r--ctree.c3
2 files changed, 10 insertions, 3 deletions
diff --git a/cmds-restore.c b/cmds-restore.c
index 55a2fab8..e48df403 100644
--- a/cmds-restore.c
+++ b/cmds-restore.c
@@ -152,9 +152,11 @@ int next_leaf(struct btrfs_root *root, struct btrfs_path *path)
{
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;
@@ -169,7 +171,7 @@ int next_leaf(struct btrfs_root *root, struct btrfs_path *path)
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++;
@@ -182,7 +184,9 @@ int next_leaf(struct btrfs_root *root, struct btrfs_path *path)
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) {
@@ -196,6 +200,8 @@ int next_leaf(struct btrfs_root *root, struct btrfs_path *path)
if (path->reada)
reada_for_search(root, path, level, 0, 0);
next = read_node_slot(root, next, 0);
+ if (!next)
+ goto again;
}
return 0;
}
diff --git a/ctree.c b/ctree.c
index 2a400ec7..1a4f3f06 100644
--- a/ctree.c
+++ b/ctree.c
@@ -797,7 +797,8 @@ struct extent_buffer *read_node_slot(struct btrfs_root *root,
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),