[Tux3] Patch: Should update btree cursor path in insert_node
Daniel Phillips
phillips at phunq.net
Thu Dec 25 00:11:51 PST 2008
Suggested fix? It just advances next pointers in two places, and
tries to set the correct next pointer for new root. Gets rid of
the cached "next" pointer and operates directly on the cursor.
diff -r 382ff76199ac user/kernel/btree.c
--- a/user/kernel/btree.c Wed Dec 24 22:43:08 2008 -0800
+++ b/user/kernel/btree.c Thu Dec 25 00:08:37 2008 -0800
@@ -492,13 +492,13 @@ int insert_node(struct btree *btree, u64
trace("insert node 0x%Lx key 0x%Lx into node 0x%Lx", (L)childblock, (L)childkey, (L)btree->root.block);
int depth = btree->root.depth;
while (depth--) {
- struct index_entry *next = cursor->path[depth].next;
- struct buffer_head *parentbuf = cursor->path[depth].buffer;
+ struct path_level *at = cursor->path + depth;
+ struct buffer_head *parentbuf = at->buffer;
struct bnode *parent = bufdata(parentbuf);
/* insert and exit if not full */
if (bcount(parent) < btree->sb->entries_per_node) {
- add_child(parent, next, childblock, childkey);
+ add_child(parent, at->next++, childblock, childkey);
mark_buffer_dirty(parentbuf);
return 0;
}
@@ -515,14 +515,14 @@ int insert_node(struct btree *btree, u64
parent->count = to_be_u32(half);
/* if the cursor is in the new node, use that as the parent */
- if (next > parent->entries + half) {
- next = next - &parent->entries[half] + newnode->entries;
+ if (at->next > parent->entries + half) {
+ at->next = at->next - &parent->entries[half] + newnode->entries;
mark_buffer_dirty(parentbuf);
parentbuf = newbuf;
parent = newnode;
} else
mark_buffer_dirty(newbuf);
- add_child(parent, next, childblock, childkey);
+ add_child(parent, at->next++, childblock, childkey);
mark_buffer_dirty(parentbuf);
childkey = newkey;
childblock = bufindex(newbuf);
@@ -539,7 +539,7 @@ int insert_node(struct btree *btree, u64
newroot->entries[1].block = to_be_u64(childblock);
btree->root.block = bufindex(newbuf);
btree->root.depth++;
- level_root_add(cursor, newbuf, NULL); // .next = ???
+ level_root_add(cursor, newbuf, newroot->entries + 2);
//set_sb_dirty(sb);
mark_buffer_dirty(newbuf);
return 0;
_______________________________________________
Tux3 mailing list
Tux3 at tux3.org
http://mailman.tux3.org/cgi-bin/mailman/listinfo/tux3
More information about the Tux3
mailing list