nilfs2: separate function for creating new btree node block
Ryusuke Konishi [Fri, 13 Nov 2009 07:04:11 +0000 (16:04 +0900)]
Adds a separate routine for creating a btree node block.  This is a
preparation to reduce the depth of function calls during submitting
btree node buffer.

Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>

fs/nilfs2/btnode.c
fs/nilfs2/btnode.h

index 84c2538..fc3e4bd 100644 (file)
@@ -68,6 +68,32 @@ void nilfs_btnode_cache_clear(struct address_space *btnc)
        truncate_inode_pages(btnc, 0);
 }
 
+struct buffer_head *
+nilfs_btnode_create_block(struct address_space *btnc, __u64 blocknr)
+{
+       struct inode *inode = NILFS_BTNC_I(btnc);
+       struct buffer_head *bh;
+
+       bh = nilfs_grab_buffer(inode, btnc, blocknr, 1 << BH_NILFS_Node);
+       if (unlikely(!bh))
+               return NULL;
+
+       if (unlikely(buffer_mapped(bh) || buffer_uptodate(bh) ||
+                    buffer_dirty(bh))) {
+               brelse(bh);
+               BUG();
+       }
+       memset(bh->b_data, 0, 1 << inode->i_blkbits);
+       bh->b_bdev = NILFS_I_NILFS(inode)->ns_bdev;
+       bh->b_blocknr = blocknr;
+       set_buffer_mapped(bh);
+       set_buffer_uptodate(bh);
+
+       unlock_page(bh->b_page);
+       page_cache_release(bh->b_page);
+       return bh;
+}
+
 int nilfs_btnode_submit_block(struct address_space *btnc, __u64 blocknr,
                              sector_t pblocknr, struct buffer_head **pbh,
                              int newblk)
index 3e22751..c53644c 100644 (file)
@@ -40,6 +40,8 @@ struct nilfs_btnode_chkey_ctxt {
 void nilfs_btnode_cache_init_once(struct address_space *);
 void nilfs_btnode_cache_init(struct address_space *, struct backing_dev_info *);
 void nilfs_btnode_cache_clear(struct address_space *);
+struct buffer_head *nilfs_btnode_create_block(struct address_space *btnc,
+                                             __u64 blocknr);
 int nilfs_btnode_submit_block(struct address_space *, __u64, sector_t,
                              struct buffer_head **, int);
 int nilfs_btnode_get(struct address_space *, __u64, sector_t,