mirror of https://gitee.com/openkylin/linux.git
nilfs2: introduce check flag to btree node buffer
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>
This commit is contained in:
parent
464ece8863
commit
4e13e66bee
|
@ -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)
|
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);
|
bh->b_size, bh->b_blocknr);
|
||||||
|
if (likely(!ret))
|
||||||
|
set_buffer_nilfs_checked(bh);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct nilfs_btree_node *
|
static struct nilfs_btree_node *
|
||||||
|
|
|
@ -37,7 +37,8 @@
|
||||||
|
|
||||||
#define NILFS_BUFFER_INHERENT_BITS \
|
#define NILFS_BUFFER_INHERENT_BITS \
|
||||||
((1UL << BH_Uptodate) | (1UL << BH_Mapped) | (1UL << BH_NILFS_Node) | \
|
((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 *
|
static struct buffer_head *
|
||||||
__nilfs_get_page_block(struct page *page, unsigned long block, pgoff_t index,
|
__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);
|
lock_buffer(bh);
|
||||||
clear_buffer_nilfs_volatile(bh);
|
clear_buffer_nilfs_volatile(bh);
|
||||||
|
clear_buffer_nilfs_checked(bh);
|
||||||
clear_buffer_dirty(bh);
|
clear_buffer_dirty(bh);
|
||||||
if (nilfs_page_buffers_clean(page))
|
if (nilfs_page_buffers_clean(page))
|
||||||
__nilfs_clear_page_dirty(page);
|
__nilfs_clear_page_dirty(page);
|
||||||
|
@ -480,6 +482,7 @@ void nilfs_clear_dirty_pages(struct address_space *mapping)
|
||||||
lock_buffer(bh);
|
lock_buffer(bh);
|
||||||
clear_buffer_dirty(bh);
|
clear_buffer_dirty(bh);
|
||||||
clear_buffer_nilfs_volatile(bh);
|
clear_buffer_nilfs_volatile(bh);
|
||||||
|
clear_buffer_nilfs_checked(bh);
|
||||||
clear_buffer_uptodate(bh);
|
clear_buffer_uptodate(bh);
|
||||||
clear_buffer_mapped(bh);
|
clear_buffer_mapped(bh);
|
||||||
unlock_buffer(bh);
|
unlock_buffer(bh);
|
||||||
|
|
|
@ -34,11 +34,13 @@ enum {
|
||||||
BH_NILFS_Allocated = BH_PrivateStart,
|
BH_NILFS_Allocated = BH_PrivateStart,
|
||||||
BH_NILFS_Node,
|
BH_NILFS_Node,
|
||||||
BH_NILFS_Volatile,
|
BH_NILFS_Volatile,
|
||||||
|
BH_NILFS_Checked,
|
||||||
};
|
};
|
||||||
|
|
||||||
BUFFER_FNS(NILFS_Allocated, nilfs_allocated) /* nilfs private buffers */
|
BUFFER_FNS(NILFS_Allocated, nilfs_allocated) /* nilfs private buffers */
|
||||||
BUFFER_FNS(NILFS_Node, nilfs_node) /* nilfs node buffers */
|
BUFFER_FNS(NILFS_Node, nilfs_node) /* nilfs node buffers */
|
||||||
BUFFER_FNS(NILFS_Volatile, nilfs_volatile)
|
BUFFER_FNS(NILFS_Volatile, nilfs_volatile)
|
||||||
|
BUFFER_FNS(NILFS_Checked, nilfs_checked) /* buffer is verified */
|
||||||
|
|
||||||
|
|
||||||
void nilfs_mark_buffer_dirty(struct buffer_head *bh);
|
void nilfs_mark_buffer_dirty(struct buffer_head *bh);
|
||||||
|
|
Loading…
Reference in New Issue