@@ -543,7 +543,7 @@ int f2fs_try_to_free_nats(struct f2fs_sb_info *sbi, int nr_shrink)
543543}
544544
545545int f2fs_get_node_info (struct f2fs_sb_info * sbi , nid_t nid ,
546- struct node_info * ni )
546+ struct node_info * ni , bool checkpoint_context )
547547{
548548 struct f2fs_nm_info * nm_i = NM_I (sbi );
549549 struct curseg_info * curseg = CURSEG_I (sbi , CURSEG_HOT_DATA );
@@ -576,9 +576,10 @@ int f2fs_get_node_info(struct f2fs_sb_info *sbi, nid_t nid,
576576 * nat_tree_lock. Therefore, we should retry, if we failed to grab here
577577 * while not bothering checkpoint.
578578 */
579- if (!rwsem_is_locked (& sbi -> cp_global_sem )) {
579+ if (!rwsem_is_locked (& sbi -> cp_global_sem ) || checkpoint_context ) {
580580 down_read (& curseg -> journal_rwsem );
581- } else if (!down_read_trylock (& curseg -> journal_rwsem )) {
581+ } else if (rwsem_is_contended (& nm_i -> nat_tree_lock ) ||
582+ !down_read_trylock (& curseg -> journal_rwsem )) {
582583 up_read (& nm_i -> nat_tree_lock );
583584 goto retry ;
584585 }
@@ -891,7 +892,7 @@ static int truncate_node(struct dnode_of_data *dn)
891892 int err ;
892893 pgoff_t index ;
893894
894- err = f2fs_get_node_info (sbi , dn -> nid , & ni );
895+ err = f2fs_get_node_info (sbi , dn -> nid , & ni , false );
895896 if (err )
896897 return err ;
897898
@@ -1290,7 +1291,7 @@ struct page *f2fs_new_node_page(struct dnode_of_data *dn, unsigned int ofs)
12901291 goto fail ;
12911292
12921293#ifdef CONFIG_F2FS_CHECK_FS
1293- err = f2fs_get_node_info (sbi , dn -> nid , & new_ni );
1294+ err = f2fs_get_node_info (sbi , dn -> nid , & new_ni , false );
12941295 if (err ) {
12951296 dec_valid_node_count (sbi , dn -> inode , !ofs );
12961297 goto fail ;
@@ -1352,7 +1353,7 @@ static int read_node_page(struct page *page, int op_flags)
13521353 return LOCKED_PAGE ;
13531354 }
13541355
1355- err = f2fs_get_node_info (sbi , page -> index , & ni );
1356+ err = f2fs_get_node_info (sbi , page -> index , & ni , false );
13561357 if (err )
13571358 return err ;
13581359
@@ -1604,7 +1605,7 @@ static int __write_node_page(struct page *page, bool atomic, bool *submitted,
16041605 nid = nid_of_node (page );
16051606 f2fs_bug_on (sbi , page -> index != nid );
16061607
1607- if (f2fs_get_node_info (sbi , nid , & ni ))
1608+ if (f2fs_get_node_info (sbi , nid , & ni , ! do_balance ))
16081609 goto redirty_out ;
16091610
16101611 if (wbc -> for_reclaim ) {
@@ -2705,7 +2706,7 @@ int f2fs_recover_xattr_data(struct inode *inode, struct page *page)
27052706 goto recover_xnid ;
27062707
27072708 /* 1: invalidate the previous xattr nid */
2708- err = f2fs_get_node_info (sbi , prev_xnid , & ni );
2709+ err = f2fs_get_node_info (sbi , prev_xnid , & ni , false );
27092710 if (err )
27102711 return err ;
27112712
@@ -2745,7 +2746,7 @@ int f2fs_recover_inode_page(struct f2fs_sb_info *sbi, struct page *page)
27452746 struct page * ipage ;
27462747 int err ;
27472748
2748- err = f2fs_get_node_info (sbi , ino , & old_ni );
2749+ err = f2fs_get_node_info (sbi , ino , & old_ni , false );
27492750 if (err )
27502751 return err ;
27512752
0 commit comments