@@ -204,14 +204,17 @@ static struct nat_entry *__init_nat_entry(struct f2fs_nm_info *nm_i,
204
204
return ne ;
205
205
}
206
206
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 )
208
208
{
209
209
struct nat_entry * ne ;
210
210
211
211
ne = radix_tree_lookup (& nm_i -> nat_root , n );
212
212
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 ) {
215
218
spin_lock (& nm_i -> nat_list_lock );
216
219
if (!list_empty (& ne -> list ))
217
220
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)
383
386
bool need = false;
384
387
385
388
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 );
387
390
if (e ) {
388
391
if (!get_nat_flag (e , IS_CHECKPOINTED ) &&
389
392
!get_nat_flag (e , HAS_FSYNCED_INODE ))
@@ -400,7 +403,7 @@ bool f2fs_is_checkpointed_node(struct f2fs_sb_info *sbi, nid_t nid)
400
403
bool is_cp = true;
401
404
402
405
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 );
404
407
if (e && !get_nat_flag (e , IS_CHECKPOINTED ))
405
408
is_cp = false;
406
409
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)
414
417
bool need_update = true;
415
418
416
419
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 );
418
421
if (e && get_nat_flag (e , HAS_LAST_FSYNC ) &&
419
422
(get_nat_flag (e , IS_CHECKPOINTED ) ||
420
423
get_nat_flag (e , HAS_FSYNCED_INODE )))
@@ -439,7 +442,7 @@ static void cache_nat_entry(struct f2fs_sb_info *sbi, nid_t nid,
439
442
return ;
440
443
441
444
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 );
443
446
if (!e )
444
447
e = __init_nat_entry (nm_i , new , ne , false);
445
448
else
@@ -460,7 +463,7 @@ static void set_node_addr(struct f2fs_sb_info *sbi, struct node_info *ni,
460
463
struct nat_entry * new = __alloc_nat_entry (sbi , ni -> nid , true);
461
464
462
465
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 );
464
467
if (!e ) {
465
468
e = __init_nat_entry (nm_i , new , NULL , true);
466
469
copy_node_info (& e -> ni , ni );
@@ -502,7 +505,7 @@ static void set_node_addr(struct f2fs_sb_info *sbi, struct node_info *ni,
502
505
503
506
/* update fsync_mark if its inode nat entry is still alive */
504
507
if (ni -> nid != ni -> ino )
505
- e = __lookup_nat_cache (nm_i , ni -> ino );
508
+ e = __lookup_nat_cache (nm_i , ni -> ino , false );
506
509
if (e ) {
507
510
if (fsync_done && ni -> nid == ni -> ino )
508
511
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,
562
565
retry :
563
566
/* Check nat cache */
564
567
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 );
566
569
if (e ) {
567
570
ni -> ino = nat_get_ino (e );
568
571
ni -> blk_addr = nat_get_blkaddr (e );
@@ -2371,7 +2374,7 @@ static bool add_free_nid(struct f2fs_sb_info *sbi,
2371
2374
* - __remove_nid_from_list(PREALLOC_NID)
2372
2375
* - __insert_nid_to_list(FREE_NID)
2373
2376
*/
2374
- ne = __lookup_nat_cache (nm_i , nid );
2377
+ ne = __lookup_nat_cache (nm_i , nid , false );
2375
2378
if (ne && (!get_nat_flag (ne , IS_CHECKPOINTED ) ||
2376
2379
nat_get_blkaddr (ne ) != NULL_ADDR ))
2377
2380
goto err_out ;
@@ -2936,7 +2939,7 @@ static void remove_nats_in_journal(struct f2fs_sb_info *sbi)
2936
2939
2937
2940
raw_ne = nat_in_journal (journal , i );
2938
2941
2939
- ne = __lookup_nat_cache (nm_i , nid );
2942
+ ne = __lookup_nat_cache (nm_i , nid , true );
2940
2943
if (!ne ) {
2941
2944
ne = __alloc_nat_entry (sbi , nid , true);
2942
2945
__init_nat_entry (nm_i , ne , & raw_ne , true);
0 commit comments