btrfs-restore: deal with NULL returns from read_node_slot
authorChris Mason <chris.mason@fusionio.com>
Fri, 5 Jul 2013 17:44:07 +0000 (13:44 -0400)
committerChris Mason <chris.mason@fusionio.com>
Fri, 5 Jul 2013 17:44:07 +0000 (13:44 -0400)
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
cmds-restore.c
ctree.c

index 55a2fab..e48df40 100644 (file)
@@ -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 2a400ec..1a4f3f0 100644 (file)
--- 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),