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

Commit 66a82d1f authored by Yunlei He's avatar Yunlei He Committed by Jaegeuk Kim
Browse files

f2fs: seperate read nat page from nat_tree_lock



This patch seperate nat page read io from nat_tree_lock.

-lock_page
	-get_node_info()
		-current_nat_addr

			......           	->       write_checkpoint

			-get_meta_page

Because we lock node page, we can make sure no other threads
modify this nid concurrently. So we just obtain current_nat_addr
under nat_tree_lock, node info is always same in both nat pack.

Signed-off-by: default avatarYunlei He <heyunlei@huawei.com>
Reviewed-by: default avatarChao Yu <yuchao0@huawei.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent d3bb910c
Loading
Loading
Loading
Loading
+8 −3
Original line number Original line Diff line number Diff line
@@ -376,6 +376,7 @@ void get_node_info(struct f2fs_sb_info *sbi, nid_t nid, struct node_info *ni)
	struct page *page = NULL;
	struct page *page = NULL;
	struct f2fs_nat_entry ne;
	struct f2fs_nat_entry ne;
	struct nat_entry *e;
	struct nat_entry *e;
	pgoff_t index;
	int i;
	int i;


	ni->nid = nid;
	ni->nid = nid;
@@ -401,17 +402,21 @@ void get_node_info(struct f2fs_sb_info *sbi, nid_t nid, struct node_info *ni)
		node_info_from_raw_nat(ni, &ne);
		node_info_from_raw_nat(ni, &ne);
	}
	}
	up_read(&curseg->journal_rwsem);
	up_read(&curseg->journal_rwsem);
	if (i >= 0)
	if (i >= 0) {
		up_read(&nm_i->nat_tree_lock);
		goto cache;
		goto cache;
	}


	/* Fill node_info from nat page */
	/* Fill node_info from nat page */
	page = get_current_nat_page(sbi, start_nid);
	index = current_nat_addr(sbi, nid);
	up_read(&nm_i->nat_tree_lock);

	page = get_meta_page(sbi, index);
	nat_blk = (struct f2fs_nat_block *)page_address(page);
	nat_blk = (struct f2fs_nat_block *)page_address(page);
	ne = nat_blk->entries[nid - start_nid];
	ne = nat_blk->entries[nid - start_nid];
	node_info_from_raw_nat(ni, &ne);
	node_info_from_raw_nat(ni, &ne);
	f2fs_put_page(page, 1);
	f2fs_put_page(page, 1);
cache:
cache:
	up_read(&nm_i->nat_tree_lock);
	/* cache nat entry */
	/* cache nat entry */
	down_write(&nm_i->nat_tree_lock);
	down_write(&nm_i->nat_tree_lock);
	cache_nat_entry(sbi, nid, &ne);
	cache_nat_entry(sbi, nid, &ne);