From e8d822fb75e97f0ea35118cb28359810fda2764d Mon Sep 17 00:00:00 2001 From: Ryusuke Konishi Date: Sun, 18 Jul 2010 10:42:25 +0900 Subject: [PATCH] --- yaml --- r: 206365 b: refs/heads/master c: 4e13e66bee2d792c1aae21797f16c181024834eb h: refs/heads/master i: 206363: 517eacc3e41ef0efe5b339e722d2e430911bd734 v: v3 --- [refs] | 2 +- trunk/fs/nilfs2/btree.c | 10 +++++++++- trunk/fs/nilfs2/page.c | 5 ++++- trunk/fs/nilfs2/page.h | 2 ++ 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index f14d95f9ebaa..cb1777c516b3 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 464ece88630d0fb715ca942eabb1da825046a534 +refs/heads/master: 4e13e66bee2d792c1aae21797f16c181024834eb diff --git a/trunk/fs/nilfs2/btree.c b/trunk/fs/nilfs2/btree.c index 1b5321c0bcac..d3faa0bba171 100644 --- a/trunk/fs/nilfs2/btree.c +++ b/trunk/fs/nilfs2/btree.c @@ -370,8 +370,16 @@ static int nilfs_btree_node_broken(const struct nilfs_btree_node *node, int nilfs_btree_broken_node_block(struct buffer_head *bh) { - return nilfs_btree_node_broken((struct nilfs_btree_node *)bh->b_data, + int ret; + + if (buffer_nilfs_checked(bh)) + return 0; + + ret = nilfs_btree_node_broken((struct nilfs_btree_node *)bh->b_data, bh->b_size, bh->b_blocknr); + if (likely(!ret)) + set_buffer_nilfs_checked(bh); + return ret; } static struct nilfs_btree_node * diff --git a/trunk/fs/nilfs2/page.c b/trunk/fs/nilfs2/page.c index 8de3e1e48130..aab11db2cb08 100644 --- a/trunk/fs/nilfs2/page.c +++ b/trunk/fs/nilfs2/page.c @@ -37,7 +37,8 @@ #define NILFS_BUFFER_INHERENT_BITS \ ((1UL << BH_Uptodate) | (1UL << BH_Mapped) | (1UL << BH_NILFS_Node) | \ - (1UL << BH_NILFS_Volatile) | (1UL << BH_NILFS_Allocated)) + (1UL << BH_NILFS_Volatile) | (1UL << BH_NILFS_Allocated) | \ + (1UL << BH_NILFS_Checked)) static struct buffer_head * __nilfs_get_page_block(struct page *page, unsigned long block, pgoff_t index, @@ -129,6 +130,7 @@ void nilfs_forget_buffer(struct buffer_head *bh) lock_buffer(bh); clear_buffer_nilfs_volatile(bh); + clear_buffer_nilfs_checked(bh); clear_buffer_dirty(bh); if (nilfs_page_buffers_clean(page)) __nilfs_clear_page_dirty(page); @@ -480,6 +482,7 @@ void nilfs_clear_dirty_pages(struct address_space *mapping) lock_buffer(bh); clear_buffer_dirty(bh); clear_buffer_nilfs_volatile(bh); + clear_buffer_nilfs_checked(bh); clear_buffer_uptodate(bh); clear_buffer_mapped(bh); unlock_buffer(bh); diff --git a/trunk/fs/nilfs2/page.h b/trunk/fs/nilfs2/page.h index 8abca4d1c1f8..f53d8da41ed7 100644 --- a/trunk/fs/nilfs2/page.h +++ b/trunk/fs/nilfs2/page.h @@ -34,11 +34,13 @@ enum { BH_NILFS_Allocated = BH_PrivateStart, BH_NILFS_Node, BH_NILFS_Volatile, + BH_NILFS_Checked, }; BUFFER_FNS(NILFS_Allocated, nilfs_allocated) /* nilfs private buffers */ BUFFER_FNS(NILFS_Node, nilfs_node) /* nilfs node buffers */ BUFFER_FNS(NILFS_Volatile, nilfs_volatile) +BUFFER_FNS(NILFS_Checked, nilfs_checked) /* buffer is verified */ void nilfs_mark_buffer_dirty(struct buffer_head *bh);