OGAWA Hirofumi <[email protected]> writes:

>> Well, this make simple sb/inode user, on stack sb/inode is setted up by
>> macros, so we can avoid strace thing by unsetup sb/inode.
>>
>> And, with this, we can share tux_new_volmap() in both of userland and
>> kernel.
>>
>>      static-http://userweb.kernel.org/~hirofumi/tux3/
>>
>> Please review and pull if ok.
>
> I've added lockdep warning fix. With this, we can use lockdep without warning.

Just demonstration though for now. With this hack, volmap/tux_vol_apos
seem to work.
-- 
OGAWA Hirofumi <[email protected]>

diff -puN user/tux3.h~vol_bread user/tux3.h
--- tux3/user/tux3.h~vol_bread  2009-01-10 00:24:32.000000000 +0900
+++ tux3-hirofumi/user/tux3.h   2009-01-10 00:24:32.000000000 +0900
@@ -152,16 +152,6 @@ struct tux_iattr {
        unsigned mode, uid, gid;
 };
 
-static inline struct buffer_head *sb_getblk(struct sb *sb, block_t block)
-{
-       return blockget(sb->volmap->map, block);
-}
-
-static inline struct buffer_head *sb_bread(struct sb *sb, block_t block)
-{
-       return blockread(sb->volmap->map, block);
-}
-
 #define rapid_new_inode(sb, ops, mode) ({                      \
        struct inode *__inode = &(struct inode){                \
                .i_sb = sb,                                     \
diff -puN user/kernel/btree.c~vol_bread user/kernel/btree.c
--- tux3/user/kernel/btree.c~vol_bread  2009-01-10 00:24:32.000000000 +0900
+++ tux3-hirofumi/user/kernel/btree.c   2009-01-10 00:24:32.000000000 +0900
@@ -43,7 +43,7 @@ static struct buffer_head *new_block(str
        block_t block = (btree->ops->balloc)(btree->sb, 1);
        if (block == -1)
                return NULL;
-       struct buffer_head *buffer = sb_getblk(vfs_sb(btree->sb), block);
+       struct buffer_head *buffer = vol_getblk(btree->sb, block);
        if (!buffer)
                return NULL;
        memset(bufdata(buffer), 0, bufsize(buffer));
@@ -226,7 +226,7 @@ void free_cursor(struct cursor *cursor)
 int probe(struct btree *btree, tuxkey_t key, struct cursor *cursor)
 {
        unsigned i, depth = btree->root.depth;
-       struct buffer_head *buffer = sb_bread(vfs_sb(btree->sb), 
btree->root.block);
+       struct buffer_head *buffer = vol_bread(btree->sb, btree->root.block);
        if (!buffer)
                return -EIO;
        struct bnode *node = bufdata(buffer);
@@ -238,7 +238,7 @@ int probe(struct btree *btree, tuxkey_t 
                                break;
                trace("probe level %i, %ti of %i", i, next - node->entries, 
bcount(node));
                level_push(cursor, buffer, next);
-               if (!(buffer = sb_bread(vfs_sb(btree->sb), from_be_u64((next - 
1)->block))))
+               if (!(buffer = vol_bread(btree->sb, from_be_u64((next - 
1)->block))))
                        goto eek;
                node = (struct bnode *)bufdata(buffer);
        }
@@ -262,7 +262,7 @@ int advance(struct btree *btree, struct 
                level--;
        } while (level_finished(cursor, level));
        while (1) {
-               buffer = sb_bread(vfs_sb(btree->sb), 
from_be_u64(cursor->path[level].next->block));
+               buffer = vol_bread(btree->sb, 
from_be_u64(cursor->path[level].next->block));
                if (!buffer)
                        goto eek;
                cursor->path[level].next++;
@@ -481,7 +481,7 @@ keep_prev_node:
 
                /* push back down to leaf level */
                while (level < depth - 1) {
-                       struct buffer_head *buffer = sb_bread(vfs_sb(sb), 
from_be_u64(cursor->path[level++].next++->block));
+                       struct buffer_head *buffer = vol_bread(sb, 
from_be_u64(cursor->path[level++].next++->block));
                        if (!buffer) {
                                ret = -EIO;
                                goto out;
@@ -491,7 +491,7 @@ keep_prev_node:
                }
                //dirty_buffer_count_check(sb);
                /* go to next leaf */
-               if (!(leafbuf = sb_bread(vfs_sb(sb), 
from_be_u64(cursor->path[level].next++->block)))) {
+               if (!(leafbuf = vol_bread(sb, 
from_be_u64(cursor->path[level].next++->block)))) {
                        ret = -EIO;
                        goto out;
                }
diff -puN user/tux3graph.c~vol_bread user/tux3graph.c
--- tux3/user/tux3graph.c~vol_bread     2009-01-10 00:24:32.000000000 +0900
+++ tux3-hirofumi/user/tux3graph.c      2009-01-10 00:24:32.000000000 +0900
@@ -185,7 +185,7 @@ static int draw_advance(struct graph_inf
                level--;
        } while (level_finished(cursor, level));
        while (1) {
-               buffer = sb_bread(vfs_sb(btree->sb), 
from_be_u64(cursor->path[level].next->block));
+               buffer = vol_bread(btree->sb, 
from_be_u64(cursor->path[level].next->block));
                if (!buffer)
                        goto eek;
                cursor->path[level].next++;
diff -puN user/kernel/super.c~vol_bread user/kernel/super.c
--- tux3/user/kernel/super.c~vol_bread  2009-01-10 00:24:32.000000000 +0900
+++ tux3-hirofumi/user/kernel/super.c   2009-01-10 00:24:32.000000000 +0900
@@ -84,7 +84,7 @@ static void tux3_write_super(struct supe
        struct buffer_head *bh;
 
        BUG_ON(SB_LOC < sb->s_blocksize);
-       bh = sb_bread(sb, SB_LOC >> sb->s_blocksize_bits);
+       bh = vol_bread(tux_sb(sb), SB_LOC >> sb->s_blocksize_bits);
        if (!bh) {
                printk(KERN_ERR "TUX3: unable to read superblock\n");
                return;
@@ -196,6 +196,7 @@ static int tux3_fill_super(struct super_
        sbi->volmap = tux_new_volmap(tux_sb(sb));
        if (!sbi->volmap)
                goto error;
+       insert_inode_hash(sbi->volmap);
 
 //     struct inode *vtable;
        sbi->bitmap = tux3_iget(sb, TUX_BITMAP_INO);
diff -puN user/kernel/tux3.h~vol_bread user/kernel/tux3.h
--- tux3/user/kernel/tux3.h~vol_bread   2009-01-10 00:24:32.000000000 +0900
+++ tux3-hirofumi/user/kernel/tux3.h    2009-01-10 00:24:32.000000000 +0900
@@ -735,4 +735,14 @@ static inline void brelse_dirty(struct b
 
 static inline void change_begin(struct sb *sb) { };
 static inline void change_end(struct sb *sb) { };
+
+static inline struct buffer_head *vol_getblk(struct sb *sb, block_t block)
+{
+       return blockget(mapping(sb->volmap), block);
+}
+
+static inline struct buffer_head *vol_bread(struct sb *sb, block_t block)
+{
+       return blockread(mapping(sb->volmap), block);
+}
 #endif
diff -puN user/kernel/inode.c~vol_bread user/kernel/inode.c
--- tux3/user/kernel/inode.c~vol_bread  2009-01-10 00:24:46.000000000 +0900
+++ tux3-hirofumi/user/kernel/inode.c   2009-01-10 00:24:58.000000000 +0900
@@ -337,6 +337,8 @@ void tux3_clear_inode(struct inode *inod
 
 int tux3_write_inode(struct inode *inode, int do_sync)
 {
+       if (tux_inode(inode)->inum == TUX_VOLMAP_INO)
+               return 0;
        BUG_ON(tux_inode(inode)->inum == TUX_BITMAP_INO ||
               tux_inode(inode)->inum == TUX_VOLMAP_INO ||
               tux_inode(inode)->inum == TUX_VTABLE_INO ||
_

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

Reply via email to