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

Reply via email to