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
