Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
[cascardo/linux.git] / fs / nilfs2 / btnode.c
index 84c2538..471e269 100644 (file)
@@ -68,9 +68,34 @@ 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)
+                             sector_t pblocknr, struct buffer_head **pbh)
 {
        struct buffer_head *bh;
        struct inode *inode = NILFS_BTNC_I(btnc);
@@ -81,19 +106,6 @@ int nilfs_btnode_submit_block(struct address_space *btnc, __u64 blocknr,
                return -ENOMEM;
 
        err = -EEXIST; /* internal code */
-       if (newblk) {
-               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);
-               goto found;
-       }
 
        if (buffer_uptodate(bh) || buffer_dirty(bh))
                goto found;
@@ -135,27 +147,6 @@ out_locked:
        return err;
 }
 
-int nilfs_btnode_get(struct address_space *btnc, __u64 blocknr,
-                    sector_t pblocknr, struct buffer_head **pbh, int newblk)
-{
-       struct buffer_head *bh;
-       int err;
-
-       err = nilfs_btnode_submit_block(btnc, blocknr, pblocknr, pbh, newblk);
-       if (err == -EEXIST) /* internal code (cache hit) */
-               return 0;
-       if (unlikely(err))
-               return err;
-
-       bh = *pbh;
-       wait_on_buffer(bh);
-       if (!buffer_uptodate(bh)) {
-               brelse(bh);
-               return -EIO;
-       }
-       return 0;
-}
-
 /**
  * nilfs_btnode_delete - delete B-tree node buffer
  * @bh: buffer to be deleted
@@ -244,12 +235,13 @@ retry:
                unlock_page(obh->b_page);
        }
 
-       err = nilfs_btnode_get(btnc, newkey, 0, &nbh, 1);
-       if (likely(!err)) {
-               BUG_ON(nbh == obh);
-               ctxt->newbh = nbh;
-       }
-       return err;
+       nbh = nilfs_btnode_create_block(btnc, newkey);
+       if (!nbh)
+               return -ENOMEM;
+
+       BUG_ON(nbh == obh);
+       ctxt->newbh = nbh;
+       return 0;
 
  failed_unlock:
        unlock_page(obh->b_page);