Skip to content

Commit 3678630

Browse files
Jaegeuk KimHashcode
authored andcommitted
f2fs: fix to mark the checkpointed nat entry correctly
The nat cache entry maintains a status whether it is checkpointed or not. So, if a new cache entry is loaded from the last checkpoint, nat_entry->checkpointed should be true. If the cache entry is modified as being dirty, nat_entry->checkpoint should be false. Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
1 parent 42b5223 commit 3678630

2 files changed

Lines changed: 9 additions & 8 deletions

File tree

fs/f2fs/node.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ static struct nat_entry *grab_nat_entry(struct f2fs_nm_info *nm_i, nid_t nid)
128128
}
129129
memset(new, 0, sizeof(struct nat_entry));
130130
nat_set_nid(new, nid);
131+
new->checkpointed = true;
131132
list_add_tail(&new->list, &nm_i->nat_entries);
132133
nm_i->nat_cnt++;
133134
return new;
@@ -149,7 +150,6 @@ static void cache_nat_entry(struct f2fs_nm_info *nm_i, nid_t nid,
149150
nat_set_blkaddr(e, le32_to_cpu(ne->block_addr));
150151
nat_set_ino(e, le32_to_cpu(ne->ino));
151152
nat_set_version(e, ne->version);
152-
e->checkpointed = true;
153153
}
154154
write_unlock(&nm_i->nat_tree_lock);
155155
}
@@ -169,7 +169,6 @@ static void set_node_addr(struct f2fs_sb_info *sbi, struct node_info *ni,
169169
goto retry;
170170
}
171171
e->ni = *ni;
172-
e->checkpointed = true;
173172
f2fs_bug_on(ni->blk_addr == NEW_ADDR);
174173
} else if (new_blkaddr == NEW_ADDR) {
175174
/*
@@ -181,9 +180,6 @@ static void set_node_addr(struct f2fs_sb_info *sbi, struct node_info *ni,
181180
f2fs_bug_on(ni->blk_addr != NULL_ADDR);
182181
}
183182

184-
if (new_blkaddr == NEW_ADDR)
185-
e->checkpointed = false;
186-
187183
/* sanity check */
188184
f2fs_bug_on(nat_get_blkaddr(e) != ni->blk_addr);
189185
f2fs_bug_on(nat_get_blkaddr(e) == NULL_ADDR &&
@@ -1786,7 +1782,6 @@ void flush_nat_entries(struct f2fs_sb_info *sbi)
17861782
} else {
17871783
write_lock(&nm_i->nat_tree_lock);
17881784
__clear_nat_cache_dirty(nm_i, ne);
1789-
ne->checkpointed = true;
17901785
write_unlock(&nm_i->nat_tree_lock);
17911786
}
17921787
}

fs/f2fs/node.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,15 @@ struct nat_entry {
5858
#define nat_set_version(nat, v) (nat->ni.version = v)
5959

6060
#define __set_nat_cache_dirty(nm_i, ne) \
61-
list_move_tail(&ne->list, &nm_i->dirty_nat_entries);
61+
do { \
62+
ne->checkpointed = false; \
63+
list_move_tail(&ne->list, &nm_i->dirty_nat_entries); \
64+
} while (0);
6265
#define __clear_nat_cache_dirty(nm_i, ne) \
63-
list_move_tail(&ne->list, &nm_i->nat_entries);
66+
do { \
67+
ne->checkpointed = true; \
68+
list_move_tail(&ne->list, &nm_i->nat_entries); \
69+
} while (0);
6470
#define inc_node_version(version) (++version)
6571

6672
static inline void node_info_from_raw_nat(struct node_info *ni,

0 commit comments

Comments
 (0)