Improved patch with fewer #ifdefs, and better because it compiles the redirect code even when it is not active.
diff -r 41cb2bfda333 user/btree.c --- a/user/btree.c Tue Jan 27 13:16:58 2009 +0900 +++ b/user/btree.c Mon Jan 26 23:15:43 2009 -0800 @@ -144,7 +144,7 @@ static void tree_expand_test(struct curs struct btree *btree = cursor->btree; if (probe(btree, key, cursor)) error("probe for %Lx failed", (L)key); - struct uentry *entry = tree_expand(btree, key, 1, cursor); + struct uentry *entry = tree_expand(cursor, key, 1); *entry = (struct uentry){ .key = key, .val = key + 0x100 }; mark_buffer_dirty(cursor_leafbuf(cursor)); cursor_redirect(cursor); diff -r 41cb2bfda333 user/kernel/btree.c --- a/user/kernel/btree.c Tue Jan 27 13:16:58 2009 +0900 +++ b/user/kernel/btree.c Mon Jan 26 23:15:43 2009 -0800 @@ -327,13 +327,16 @@ static void level_redirect_brelse(struct int cursor_redirect(struct cursor *cursor) { +#ifndef ATOMIC + return 0; +#endif struct btree *btree = cursor->btree; unsigned level = btree->root.depth; struct sb *sb = btree->sb; while (1) { struct buffer_head *buffer = cursor->path[level].buffer; -// if (buffer_dirty(buffer)) -// return 0; + if (buffer_dirty(buffer)) + return 0; struct buffer_head *clone = new_block(btree); if (IS_ERR(clone)) @@ -682,8 +685,12 @@ int btree_leaf_split(struct btree *btree return insert_leaf(cursor, newkey, newbuf, key < newkey); } -void *tree_expand(struct btree *btree, tuxkey_t key, unsigned newsize, struct cursor *cursor) +void *tree_expand(struct cursor *cursor, tuxkey_t key, unsigned newsize) { + struct btree *btree = cursor->btree; + int err = cursor_redirect(cursor); + if (err) + return NULL; // ERR_PTR me!!! for (int i = 0; i < 2; i++) { struct buffer_head *leafbuf = cursor_leafbuf(cursor); void *space = (btree->ops->leaf_resize)(btree, key, bufdata(leafbuf), newsize); diff -r 41cb2bfda333 user/kernel/filemap.c --- a/user/kernel/filemap.c Tue Jan 27 13:16:58 2009 +0900 +++ b/user/kernel/filemap.c Mon Jan 26 23:15:43 2009 -0800 @@ -162,7 +162,10 @@ static int map_region(struct inode *inod if (!create) goto out_release; - + if ((err = cursor_redirect(cursor))) { + segs = err; + goto out_release; + } struct dleaf *tail = NULL; tuxkey_t tailkey = 0; // probably can just use limit instead diff -r 41cb2bfda333 user/kernel/inode.c --- a/user/kernel/inode.c Tue Jan 27 13:16:58 2009 +0900 +++ b/user/kernel/inode.c Mon Jan 26 23:15:43 2009 -0800 @@ -142,7 +142,7 @@ static int store_attrs(struct inode *ino static int store_attrs(struct inode *inode, struct cursor *cursor) { unsigned size = encode_asize(tux_inode(inode)->present) + encode_xsize(inode); - void *base = tree_expand(itable_btree(tux_sb(inode->i_sb)), tux_inode(inode)->inum, size, cursor); + void *base = tree_expand(cursor, tux_inode(inode)->inum, size); if (!base) return -ENOMEM; // ERR_PTR me!!! void *attr = encode_attrs(inode, base, size); @@ -262,6 +262,8 @@ static int purge_inum(struct sb *sb, inu int err = -ENOENT; if (!(err = probe(itable, inum, cursor))) { + if ((err = cursor_redirect(cursor))) + return err; /* FIXME: truncate the bnode and leaf if empty. */ struct buffer_head *ileafbuf = cursor_leafbuf(cursor); struct ileaf *ileaf = to_ileaf(bufdata(ileafbuf)); _______________________________________________ Tux3 mailing list Tux3@tux3.org http://mailman.tux3.org/cgi-bin/mailman/listinfo/tux3