diff -r be00799ecef0 user/kernel/btree.c
--- a/user/kernel/btree.c       Wed Dec 24 16:44:17 2008 +0900
+++ b/user/kernel/btree.c       Tue Dec 23 23:58:24 2008 -0800
@@ -601,6 +601,7 @@ struct btree new_btree(struct sb *sb, st
        printf("leaf at %Lx\n", (L)bufindex(leafbuf));
        brelse_dirty(rootbuf);
        brelse_dirty(leafbuf);
+       init_rwsem(&btree.lock);
        return btree;
 eek:
        if (rootbuf)
diff -r be00799ecef0 user/kernel/filemap.c
--- a/user/kernel/filemap.c     Wed Dec 24 16:44:17 2008 +0900
+++ b/user/kernel/filemap.c     Tue Dec 23 23:58:24 2008 -0800
@@ -214,6 +214,10 @@ static int get_segs(struct inode *inode,
        if (!cursor)
                return -ENOMEM;
 
+       if (create)
+               down_write(&cursor->btree->lock);
+       else
+               down_read(&cursor->btree->lock);
        unsigned overlap[2];
        struct dwalk seek[2] = { };
        int segs = find_segs(cursor, start, start + count, segvec, max_segs, 
seek, overlap);
@@ -221,6 +225,10 @@ static int get_segs(struct inode *inode,
                segs = fill_segs(cursor, start, start + count, segvec, segs, 
seek, overlap);
        if (segs >= 0)
                release_cursor(cursor);
+       if (create)
+               up_write(&cursor->btree->lock);
+       else
+               up_read(&cursor->btree->lock);
        free_cursor(cursor);
        return segs;
 }
@@ -334,7 +342,7 @@ int tux3_get_block(struct inode *inode, 
        struct btree *btree = &tux_inode(inode)->btree;
        int depth = btree->root.depth;
        if (!depth) {
-               warn("Uninitialied inode %lx", inode->i_ino);
+               warn("Uninitialized inode %lx", inode->i_ino);
                return 0;
        }
 
diff -r be00799ecef0 user/kernel/tux3.h
--- a/user/kernel/tux3.h        Wed Dec 24 16:44:17 2008 +0900
+++ b/user/kernel/tux3.h        Tue Dec 23 23:58:24 2008 -0800
@@ -170,6 +170,7 @@ struct btree {
        struct btree_ops *ops;  /* Generic btree low level operations */
        struct root root;       /* Cached description of btree root */
        u16 entries_per_leaf;   /* Used in btree leaf splitting */
+       struct rw_semaphore lock;
 };
 
 /* Define layout of btree root on disk, endian conversion is elsewhere. */
diff -r be00799ecef0 user/tux3.h
--- a/user/tux3.h       Wed Dec 24 16:44:17 2008 +0900
+++ b/user/tux3.h       Tue Dec 23 23:58:24 2008 -0800
@@ -52,6 +52,14 @@ typedef uint64_t u64;
 typedef uint64_t u64;
 
 typedef int fd_t;
+
+struct rw_semaphore { };
+
+static inline void down_read(struct rw_semaphore *sem) { };
+static inline void down_write(struct rw_semaphore *sem) { };
+static inline void up_read(struct rw_semaphore *sem) { };
+static inline void up_write(struct rw_semaphore *sem) { };
+static inline void init_rwsem(struct rw_semaphore *sem) { };
 
 /* Bitmaps */
 

_______________________________________________
Tux3 mailing list
[email protected]
http://mailman.tux3.org/cgi-bin/mailman/listinfo/tux3

Reply via email to