On 2017/4/22 18:06, Yunlei He wrote: > 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: Yunlei He <heyun...@huawei.com>
Reviewed-by: Chao Yu <yuch...@huawei.com> Thanks, > --- > fs/f2fs/node.c | 11 ++++++++--- > 1 file changed, 8 insertions(+), 3 deletions(-) > > diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c > index ad54e90..b99e318 100644 > --- a/fs/f2fs/node.c > +++ b/fs/f2fs/node.c > @@ -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 f2fs_nat_entry ne; > struct nat_entry *e; > + pgoff_t index; > int i; > > 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); > } > up_read(&curseg->journal_rwsem); > - if (i >= 0) > + if (i >= 0) { > + up_read(&nm_i->nat_tree_lock); > goto cache; > + } > > /* 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); > ne = nat_blk->entries[nid - start_nid]; > node_info_from_raw_nat(ni, &ne); > f2fs_put_page(page, 1); > cache: > - up_read(&nm_i->nat_tree_lock); > /* cache nat entry */ > down_write(&nm_i->nat_tree_lock); > cache_nat_entry(sbi, nid, &ne); > ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel