@@ -185,7 +185,7 @@ static void __free_nat_entry(struct nat_entry *e)
185
185
186
186
/* must be locked by nat_tree_lock */
187
187
static 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 )
189
189
{
190
190
if (no_fail )
191
191
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,
195
195
if (raw_ne )
196
196
node_info_from_raw_nat (& ne -> ni , raw_ne );
197
197
198
+ if (init_dirty ) {
199
+ INIT_LIST_HEAD (& ne -> list );
200
+ nm_i -> nat_cnt [TOTAL_NAT ]++ ;
201
+ return ne ;
202
+ }
203
+
198
204
spin_lock (& nm_i -> nat_list_lock );
199
205
list_add_tail (& ne -> list , & nm_i -> nat_entries );
200
206
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,
259
265
}
260
266
261
267
static void __set_nat_cache_dirty (struct f2fs_nm_info * nm_i ,
262
- struct nat_entry * ne )
268
+ struct nat_entry * ne , bool init_dirty )
263
269
{
264
270
struct nat_entry_set * head ;
265
271
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,
282
288
goto refresh_list ;
283
289
284
290
nm_i -> nat_cnt [DIRTY_NAT ]++ ;
285
- nm_i -> nat_cnt [RECLAIMABLE_NAT ]-- ;
291
+ if (!init_dirty )
292
+ nm_i -> nat_cnt [RECLAIMABLE_NAT ]-- ;
286
293
set_nat_flag (ne , IS_DIRTY , true);
287
294
refresh_list :
288
295
spin_lock (& nm_i -> nat_list_lock );
@@ -444,7 +451,7 @@ static void cache_nat_entry(struct f2fs_sb_info *sbi, nid_t nid,
444
451
f2fs_down_write (& nm_i -> nat_tree_lock );
445
452
e = __lookup_nat_cache (nm_i , nid , false);
446
453
if (!e )
447
- e = __init_nat_entry (nm_i , new , ne , false);
454
+ e = __init_nat_entry (nm_i , new , ne , false, false );
448
455
else
449
456
f2fs_bug_on (sbi , nat_get_ino (e ) != le32_to_cpu (ne -> ino ) ||
450
457
nat_get_blkaddr (e ) !=
@@ -461,11 +468,13 @@ static void set_node_addr(struct f2fs_sb_info *sbi, struct node_info *ni,
461
468
struct f2fs_nm_info * nm_i = NM_I (sbi );
462
469
struct nat_entry * e ;
463
470
struct nat_entry * new = __alloc_nat_entry (sbi , ni -> nid , true);
471
+ bool init_dirty = false;
464
472
465
473
f2fs_down_write (& nm_i -> nat_tree_lock );
466
474
e = __lookup_nat_cache (nm_i , ni -> nid , true);
467
475
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);
469
478
copy_node_info (& e -> ni , ni );
470
479
f2fs_bug_on (sbi , ni -> blk_addr == NEW_ADDR );
471
480
} else if (new_blkaddr == NEW_ADDR ) {
@@ -501,7 +510,7 @@ static void set_node_addr(struct f2fs_sb_info *sbi, struct node_info *ni,
501
510
nat_set_blkaddr (e , new_blkaddr );
502
511
if (!__is_valid_data_blkaddr (new_blkaddr ))
503
512
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 );
505
514
506
515
/* update fsync_mark if its inode nat entry is still alive */
507
516
if (ni -> nid != ni -> ino )
@@ -2927,6 +2936,7 @@ static void remove_nats_in_journal(struct f2fs_sb_info *sbi)
2927
2936
struct curseg_info * curseg = CURSEG_I (sbi , CURSEG_HOT_DATA );
2928
2937
struct f2fs_journal * journal = curseg -> journal ;
2929
2938
int i ;
2939
+ bool init_dirty ;
2930
2940
2931
2941
down_write (& curseg -> journal_rwsem );
2932
2942
for (i = 0 ; i < nats_in_cursum (journal ); i ++ ) {
@@ -2937,12 +2947,15 @@ static void remove_nats_in_journal(struct f2fs_sb_info *sbi)
2937
2947
if (f2fs_check_nid_range (sbi , nid ))
2938
2948
continue ;
2939
2949
2950
+ init_dirty = false;
2951
+
2940
2952
raw_ne = nat_in_journal (journal , i );
2941
2953
2942
2954
ne = __lookup_nat_cache (nm_i , nid , true);
2943
2955
if (!ne ) {
2956
+ init_dirty = true;
2944
2957
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 );
2946
2959
}
2947
2960
2948
2961
/*
@@ -2957,7 +2970,7 @@ static void remove_nats_in_journal(struct f2fs_sb_info *sbi)
2957
2970
spin_unlock (& nm_i -> nid_list_lock );
2958
2971
}
2959
2972
2960
- __set_nat_cache_dirty (nm_i , ne );
2973
+ __set_nat_cache_dirty (nm_i , ne , init_dirty );
2961
2974
}
2962
2975
update_nats_in_cursum (journal , - i );
2963
2976
up_write (& curseg -> journal_rwsem );
0 commit comments