btrfs-restore: deal with NULL returns from read_node_slot

Signed-off-by: Chris Mason <chris.mason@fusionio.com>
diff --git a/cmds-restore.c b/cmds-restore.c
index 55a2fab..e48df40 100644
--- a/cmds-restore.c
+++ b/cmds-restore.c
@@ -152,9 +152,11 @@
 {
 	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 @@
 		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 @@
 			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 @@
 		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 2a400ec..1a4f3f0 100644
--- a/ctree.c
+++ b/ctree.c
@@ -797,7 +797,8 @@
 	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),