Skip to content

Commit

Permalink
nilfs2: fix buffer head leak in nilfs_btnode_submit_block
Browse files Browse the repository at this point in the history
nilfs_btnode_submit_block() refers to buffer head just before
returning from the function, but it releases the buffer head earlier
than that if nilfs_dat_translate() gets an error.

This has potential for oops in the erroneous case.  This fixes the
issue.

Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
  • Loading branch information
Ryusuke Konishi committed Jul 23, 2010
1 parent 7c397a8 commit f8e6cc0
Showing 1 changed file with 4 additions and 2 deletions.
6 changes: 4 additions & 2 deletions fs/nilfs2/btnode.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,13 +100,15 @@ int nilfs_btnode_submit_block(struct address_space *btnc, __u64 blocknr,
{
struct buffer_head *bh;
struct inode *inode = NILFS_BTNC_I(btnc);
struct page *page;
int err;

bh = nilfs_grab_buffer(inode, btnc, blocknr, 1 << BH_NILFS_Node);
if (unlikely(!bh))
return -ENOMEM;

err = -EEXIST; /* internal code */
page = bh->b_page;

if (buffer_uptodate(bh) || buffer_dirty(bh))
goto found;
Expand Down Expand Up @@ -143,8 +145,8 @@ int nilfs_btnode_submit_block(struct address_space *btnc, __u64 blocknr,
*pbh = bh;

out_locked:
unlock_page(bh->b_page);
page_cache_release(bh->b_page);
unlock_page(page);
page_cache_release(page);
return err;
}

Expand Down

0 comments on commit f8e6cc0

Please sign in to comment.