@@ -185,7 +185,7 @@ static void __free_nat_entry(struct nat_entry *e)
185185
186186/* must be locked by nat_tree_lock */
187187static struct nat_entry * __init_nat_entry (struct f2fs_nm_info * nm_i ,
188- struct nat_entry * ne , struct f2fs_nat_entry * raw_ne , bool no_fail )
188+ struct nat_entry * ne , struct f2fs_nat_entry * raw_ne , bool no_fail , bool init_dirty )
189189{
190190 if (no_fail )
191191 f2fs_radix_tree_insert (& nm_i -> nat_root , nat_get_nid (ne ), ne );
@@ -195,6 +195,12 @@ static struct nat_entry *__init_nat_entry(struct f2fs_nm_info *nm_i,
195195 if (raw_ne )
196196 node_info_from_raw_nat (& ne -> ni , raw_ne );
197197
198+ if (init_dirty ) {
199+ INIT_LIST_HEAD (& ne -> list );
200+ nm_i -> nat_cnt [TOTAL_NAT ]++ ;
201+ return ne ;
202+ }
203+
198204 spin_lock (& nm_i -> nat_list_lock );
199205 list_add_tail (& ne -> list , & nm_i -> nat_entries );
200206 spin_unlock (& nm_i -> nat_list_lock );
@@ -259,7 +265,7 @@ static struct nat_entry_set *__grab_nat_entry_set(struct f2fs_nm_info *nm_i,
259265}
260266
261267static void __set_nat_cache_dirty (struct f2fs_nm_info * nm_i ,
262- struct nat_entry * ne )
268+ struct nat_entry * ne , bool init_dirty )
263269{
264270 struct nat_entry_set * head ;
265271 bool new_ne = nat_get_blkaddr (ne ) == NEW_ADDR ;
@@ -282,7 +288,8 @@ static void __set_nat_cache_dirty(struct f2fs_nm_info *nm_i,
282288 goto refresh_list ;
283289
284290 nm_i -> nat_cnt [DIRTY_NAT ]++ ;
285- nm_i -> nat_cnt [RECLAIMABLE_NAT ]-- ;
291+ if (!init_dirty )
292+ nm_i -> nat_cnt [RECLAIMABLE_NAT ]-- ;
286293 set_nat_flag (ne , IS_DIRTY , true);
287294refresh_list :
288295 spin_lock (& nm_i -> nat_list_lock );
@@ -444,7 +451,7 @@ static void cache_nat_entry(struct f2fs_sb_info *sbi, nid_t nid,
444451 f2fs_down_write (& nm_i -> nat_tree_lock );
445452 e = __lookup_nat_cache (nm_i , nid , false);
446453 if (!e )
447- e = __init_nat_entry (nm_i , new , ne , false);
454+ e = __init_nat_entry (nm_i , new , ne , false, false );
448455 else
449456 f2fs_bug_on (sbi , nat_get_ino (e ) != le32_to_cpu (ne -> ino ) ||
450457 nat_get_blkaddr (e ) !=
@@ -461,11 +468,13 @@ static void set_node_addr(struct f2fs_sb_info *sbi, struct node_info *ni,
461468 struct f2fs_nm_info * nm_i = NM_I (sbi );
462469 struct nat_entry * e ;
463470 struct nat_entry * new = __alloc_nat_entry (sbi , ni -> nid , true);
471+ bool init_dirty = false;
464472
465473 f2fs_down_write (& nm_i -> nat_tree_lock );
466474 e = __lookup_nat_cache (nm_i , ni -> nid , true);
467475 if (!e ) {
468- e = __init_nat_entry (nm_i , new , NULL , true);
476+ init_dirty = true;
477+ e = __init_nat_entry (nm_i , new , NULL , true, true);
469478 copy_node_info (& e -> ni , ni );
470479 f2fs_bug_on (sbi , ni -> blk_addr == NEW_ADDR );
471480 } else if (new_blkaddr == NEW_ADDR ) {
@@ -501,7 +510,7 @@ static void set_node_addr(struct f2fs_sb_info *sbi, struct node_info *ni,
501510 nat_set_blkaddr (e , new_blkaddr );
502511 if (!__is_valid_data_blkaddr (new_blkaddr ))
503512 set_nat_flag (e , IS_CHECKPOINTED , false);
504- __set_nat_cache_dirty (nm_i , e );
513+ __set_nat_cache_dirty (nm_i , e , init_dirty );
505514
506515 /* update fsync_mark if its inode nat entry is still alive */
507516 if (ni -> nid != ni -> ino )
@@ -2927,6 +2936,7 @@ static void remove_nats_in_journal(struct f2fs_sb_info *sbi)
29272936 struct curseg_info * curseg = CURSEG_I (sbi , CURSEG_HOT_DATA );
29282937 struct f2fs_journal * journal = curseg -> journal ;
29292938 int i ;
2939+ bool init_dirty ;
29302940
29312941 down_write (& curseg -> journal_rwsem );
29322942 for (i = 0 ; i < nats_in_cursum (journal ); i ++ ) {
@@ -2937,12 +2947,15 @@ static void remove_nats_in_journal(struct f2fs_sb_info *sbi)
29372947 if (f2fs_check_nid_range (sbi , nid ))
29382948 continue ;
29392949
2950+ init_dirty = false;
2951+
29402952 raw_ne = nat_in_journal (journal , i );
29412953
29422954 ne = __lookup_nat_cache (nm_i , nid , true);
29432955 if (!ne ) {
2956+ init_dirty = true;
29442957 ne = __alloc_nat_entry (sbi , nid , true);
2945- __init_nat_entry (nm_i , ne , & raw_ne , true);
2958+ __init_nat_entry (nm_i , ne , & raw_ne , true, true );
29462959 }
29472960
29482961 /*
@@ -2957,7 +2970,7 @@ static void remove_nats_in_journal(struct f2fs_sb_info *sbi)
29572970 spin_unlock (& nm_i -> nid_list_lock );
29582971 }
29592972
2960- __set_nat_cache_dirty (nm_i , ne );
2973+ __set_nat_cache_dirty (nm_i , ne , init_dirty );
29612974 }
29622975 update_nats_in_cursum (journal , - i );
29632976 up_write (& curseg -> journal_rwsem );
0 commit comments