@@ -204,14 +204,17 @@ static struct nat_entry *__init_nat_entry(struct f2fs_nm_info *nm_i,
204204 return ne ;
205205}
206206
207- static struct nat_entry * __lookup_nat_cache (struct f2fs_nm_info * nm_i , nid_t n )
207+ static struct nat_entry * __lookup_nat_cache (struct f2fs_nm_info * nm_i , nid_t n , bool for_dirty )
208208{
209209 struct nat_entry * ne ;
210210
211211 ne = radix_tree_lookup (& nm_i -> nat_root , n );
212212
213- /* for recent accessed nat entry, move it to tail of lru list */
214- if (ne && !get_nat_flag (ne , IS_DIRTY )) {
213+ /*
214+ * for recent accessed nat entry which will not be dirtied soon
215+ * later, move it to tail of lru list.
216+ */
217+ if (ne && !get_nat_flag (ne , IS_DIRTY ) && !for_dirty ) {
215218 spin_lock (& nm_i -> nat_list_lock );
216219 if (!list_empty (& ne -> list ))
217220 list_move_tail (& ne -> list , & nm_i -> nat_entries );
@@ -383,7 +386,7 @@ int f2fs_need_dentry_mark(struct f2fs_sb_info *sbi, nid_t nid)
383386 bool need = false;
384387
385388 f2fs_down_read (& nm_i -> nat_tree_lock );
386- e = __lookup_nat_cache (nm_i , nid );
389+ e = __lookup_nat_cache (nm_i , nid , false );
387390 if (e ) {
388391 if (!get_nat_flag (e , IS_CHECKPOINTED ) &&
389392 !get_nat_flag (e , HAS_FSYNCED_INODE ))
@@ -400,7 +403,7 @@ bool f2fs_is_checkpointed_node(struct f2fs_sb_info *sbi, nid_t nid)
400403 bool is_cp = true;
401404
402405 f2fs_down_read (& nm_i -> nat_tree_lock );
403- e = __lookup_nat_cache (nm_i , nid );
406+ e = __lookup_nat_cache (nm_i , nid , false );
404407 if (e && !get_nat_flag (e , IS_CHECKPOINTED ))
405408 is_cp = false;
406409 f2fs_up_read (& nm_i -> nat_tree_lock );
@@ -414,7 +417,7 @@ bool f2fs_need_inode_block_update(struct f2fs_sb_info *sbi, nid_t ino)
414417 bool need_update = true;
415418
416419 f2fs_down_read (& nm_i -> nat_tree_lock );
417- e = __lookup_nat_cache (nm_i , ino );
420+ e = __lookup_nat_cache (nm_i , ino , false );
418421 if (e && get_nat_flag (e , HAS_LAST_FSYNC ) &&
419422 (get_nat_flag (e , IS_CHECKPOINTED ) ||
420423 get_nat_flag (e , HAS_FSYNCED_INODE )))
@@ -439,7 +442,7 @@ static void cache_nat_entry(struct f2fs_sb_info *sbi, nid_t nid,
439442 return ;
440443
441444 f2fs_down_write (& nm_i -> nat_tree_lock );
442- e = __lookup_nat_cache (nm_i , nid );
445+ e = __lookup_nat_cache (nm_i , nid , false );
443446 if (!e )
444447 e = __init_nat_entry (nm_i , new , ne , false);
445448 else
@@ -460,7 +463,7 @@ static void set_node_addr(struct f2fs_sb_info *sbi, struct node_info *ni,
460463 struct nat_entry * new = __alloc_nat_entry (sbi , ni -> nid , true);
461464
462465 f2fs_down_write (& nm_i -> nat_tree_lock );
463- e = __lookup_nat_cache (nm_i , ni -> nid );
466+ e = __lookup_nat_cache (nm_i , ni -> nid , true );
464467 if (!e ) {
465468 e = __init_nat_entry (nm_i , new , NULL , true);
466469 copy_node_info (& e -> ni , ni );
@@ -502,7 +505,7 @@ static void set_node_addr(struct f2fs_sb_info *sbi, struct node_info *ni,
502505
503506 /* update fsync_mark if its inode nat entry is still alive */
504507 if (ni -> nid != ni -> ino )
505- e = __lookup_nat_cache (nm_i , ni -> ino );
508+ e = __lookup_nat_cache (nm_i , ni -> ino , false );
506509 if (e ) {
507510 if (fsync_done && ni -> nid == ni -> ino )
508511 set_nat_flag (e , HAS_FSYNCED_INODE , true);
@@ -562,7 +565,7 @@ int f2fs_get_node_info(struct f2fs_sb_info *sbi, nid_t nid,
562565retry :
563566 /* Check nat cache */
564567 f2fs_down_read (& nm_i -> nat_tree_lock );
565- e = __lookup_nat_cache (nm_i , nid );
568+ e = __lookup_nat_cache (nm_i , nid , false );
566569 if (e ) {
567570 ni -> ino = nat_get_ino (e );
568571 ni -> blk_addr = nat_get_blkaddr (e );
@@ -2371,7 +2374,7 @@ static bool add_free_nid(struct f2fs_sb_info *sbi,
23712374 * - __remove_nid_from_list(PREALLOC_NID)
23722375 * - __insert_nid_to_list(FREE_NID)
23732376 */
2374- ne = __lookup_nat_cache (nm_i , nid );
2377+ ne = __lookup_nat_cache (nm_i , nid , false );
23752378 if (ne && (!get_nat_flag (ne , IS_CHECKPOINTED ) ||
23762379 nat_get_blkaddr (ne ) != NULL_ADDR ))
23772380 goto err_out ;
@@ -2936,7 +2939,7 @@ static void remove_nats_in_journal(struct f2fs_sb_info *sbi)
29362939
29372940 raw_ne = nat_in_journal (journal , i );
29382941
2939- ne = __lookup_nat_cache (nm_i , nid );
2942+ ne = __lookup_nat_cache (nm_i , nid , true );
29402943 if (!ne ) {
29412944 ne = __alloc_nat_entry (sbi , nid , true);
29422945 __init_nat_entry (nm_i , ne , & raw_ne , true);
0 commit comments