From 194aa4a1bd6447bb545286d0bcb0b0be8204d79f Mon Sep 17 00:00:00 2001 From: Chris Mason Date: Fri, 5 Jul 2013 13:44:07 -0400 Subject: btrfs-restore: deal with NULL returns from read_node_slot Signed-off-by: Chris Mason --- cmds-restore.c | 10 ++++++++-- ctree.c | 3 ++- 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), -- cgit v1.2.3