Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4e13e66b authored by Ryusuke Konishi's avatar Ryusuke Konishi
Browse files

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: default avatarRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
parent 464ece88
Loading
Loading
Loading
Loading
+9 −1
Original line number Original line Diff line number Diff line
@@ -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 *
+4 −1
Original line number Original line Diff line number Diff line
@@ -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);
+2 −0
Original line number Original line Diff line number Diff line
@@ -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);