nilfs2: introduce check flag to btree node buffer
authorRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
Sun, 18 Jul 2010 01:42:25 +0000 (10:42 +0900)
committerRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
Fri, 23 Jul 2010 01:02:15 +0000 (10:02 +0900)
nilfs_btree_get_block() now may return untested buffer due to
read-ahead.  This adds a new flag for buffer heads so that the btree
code can check whether the buffer is already verified or not.

Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
fs/nilfs2/btree.c
fs/nilfs2/page.c
fs/nilfs2/page.h

index 1b5321c0bcac86866d1f81eb555b46af26abac45..d3faa0bba171c42bddaee3e5d79bb21c48fcd004 100644 (file)
@@ -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 *
index 8de3e1e48130ff6e042e3ba7c7d10b218e1d1268..aab11db2cb083cbf2d45fc258b0de5315d598cf3 100644 (file)
@@ -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);
index 8abca4d1c1f82701bbc4d1d5a8eea310fe5dca28..f53d8da41ed7004fd1cd8692f7d6019f91e71db1 100644 (file)
@@ -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);