|
@@ -847,22 +847,26 @@ EXPORT_SYMBOL_GPL(dm_btree_find_lowest_key);
|
|
|
* FIXME: We shouldn't use a recursive algorithm when we have limited stack
|
|
|
* space. Also this only works for single level trees.
|
|
|
*/
|
|
|
-static int walk_node(struct ro_spine *s, dm_block_t block,
|
|
|
+static int walk_node(struct dm_btree_info *info, dm_block_t block,
|
|
|
int (*fn)(void *context, uint64_t *keys, void *leaf),
|
|
|
void *context)
|
|
|
{
|
|
|
int r;
|
|
|
unsigned i, nr;
|
|
|
+ struct dm_block *node;
|
|
|
struct btree_node *n;
|
|
|
uint64_t keys;
|
|
|
|
|
|
- r = ro_step(s, block);
|
|
|
- n = ro_node(s);
|
|
|
+ r = bn_read_lock(info, block, &node);
|
|
|
+ if (r)
|
|
|
+ return r;
|
|
|
+
|
|
|
+ n = dm_block_data(node);
|
|
|
|
|
|
nr = le32_to_cpu(n->header.nr_entries);
|
|
|
for (i = 0; i < nr; i++) {
|
|
|
if (le32_to_cpu(n->header.flags) & INTERNAL_NODE) {
|
|
|
- r = walk_node(s, value64(n, i), fn, context);
|
|
|
+ r = walk_node(info, value64(n, i), fn, context);
|
|
|
if (r)
|
|
|
goto out;
|
|
|
} else {
|
|
@@ -874,7 +878,7 @@ static int walk_node(struct ro_spine *s, dm_block_t block,
|
|
|
}
|
|
|
|
|
|
out:
|
|
|
- ro_pop(s);
|
|
|
+ dm_tm_unlock(info->tm, node);
|
|
|
return r;
|
|
|
}
|
|
|
|
|
@@ -882,15 +886,7 @@ int dm_btree_walk(struct dm_btree_info *info, dm_block_t root,
|
|
|
int (*fn)(void *context, uint64_t *keys, void *leaf),
|
|
|
void *context)
|
|
|
{
|
|
|
- int r;
|
|
|
- struct ro_spine spine;
|
|
|
-
|
|
|
BUG_ON(info->levels > 1);
|
|
|
-
|
|
|
- init_ro_spine(&spine, info);
|
|
|
- r = walk_node(&spine, root, fn, context);
|
|
|
- exit_ro_spine(&spine);
|
|
|
-
|
|
|
- return r;
|
|
|
+ return walk_node(info, root, fn, context);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(dm_btree_walk);
|