Skip to content

Commit 40aa9e1

Browse files
wangzijieJaegeuk Kim
authored andcommitted
f2fs: directly add newly allocated pre-dirty nat entry to dirty set list
When we need to alloc nat entry and set it dirty, we can directly add it to dirty set list(or initialize its list_head for new_ne) instead of adding it to clean list and make a move. Introduce init_dirty flag to do it. Signed-off-by: wangzijie <[email protected]> Reviewed-by: Chao Yu <[email protected]> Signed-off-by: Jaegeuk Kim <[email protected]>
1 parent 0349b7f commit 40aa9e1

File tree

1 file changed

+21
-8
lines changed

1 file changed

+21
-8
lines changed

fs/f2fs/node.c

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ static void __free_nat_entry(struct nat_entry *e)
185185

186186
/* must be locked by nat_tree_lock */
187187
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)
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

261267
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)
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);
287294
refresh_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

Comments
 (0)