Skip to content

Commit

Permalink
nilfs2: ensure to clear dirty state when deleting metadata file block
Browse files Browse the repository at this point in the history
This would fix the following failure during GC:

 nilfs_cpfile_delete_checkpoints: cannot delete block
 NILFS: GC failed during preparation: cannot delete checkpoints: err=-2

The problem was caused by a break in state consistency between page
cache and btree; the above block was removed from the btree but the
page buffering the block was remaining in the page cache in dirty
state.

This resolves the inconsistency by ensuring to clear dirty state of
the page buffering the deleted block.

Reported-by: David Arendt <admin@prnet.org>
Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
  • Loading branch information
Ryusuke Konishi committed May 10, 2009
1 parent 201913e commit 8433823
Show file tree
Hide file tree
Showing 2 changed files with 3 additions and 2 deletions.
2 changes: 1 addition & 1 deletion fs/nilfs2/mdt.c
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,7 @@ int nilfs_mdt_delete_block(struct inode *inode, unsigned long block)
int err;

err = nilfs_bmap_delete(ii->i_bmap, block);
if (likely(!err)) {
if (!err || err == -ENOENT) {
nilfs_mdt_mark_dirty(inode);
nilfs_mdt_forget_block(inode, block);
}
Expand Down
3 changes: 2 additions & 1 deletion fs/nilfs2/page.c
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,8 @@ void nilfs_forget_buffer(struct buffer_head *bh)

lock_buffer(bh);
clear_buffer_nilfs_volatile(bh);
if (test_clear_buffer_dirty(bh) && nilfs_page_buffers_clean(page))
clear_buffer_dirty(bh);
if (nilfs_page_buffers_clean(page))
__nilfs_clear_page_dirty(page);

clear_buffer_uptodate(bh);
Expand Down

0 comments on commit 8433823

Please sign in to comment.