Skip to content

Commit b7cc9e3

Browse files
chaseyugregkh
authored andcommitted
Revert "f2fs: rebuild nat_bits during umount"
[ Upstream commit 19426c4 ] This reverts commit 94c821f. It reports that there is potential corruption in node footer, the most suspious feature is nat_bits, let's revert recovery related code. Signed-off-by: Chao Yu <chao@kernel.org> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 1dbece9 commit b7cc9e3

File tree

3 files changed

+59
-95
lines changed

3 files changed

+59
-95
lines changed

fs/f2fs/checkpoint.c

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1327,21 +1327,13 @@ static void update_ckpt_flags(struct f2fs_sb_info *sbi, struct cp_control *cpc)
13271327
struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
13281328
unsigned long flags;
13291329

1330-
if (cpc->reason & CP_UMOUNT) {
1331-
if (le32_to_cpu(ckpt->cp_pack_total_block_count) +
1332-
NM_I(sbi)->nat_bits_blocks > BLKS_PER_SEG(sbi)) {
1333-
clear_ckpt_flags(sbi, CP_NAT_BITS_FLAG);
1334-
f2fs_notice(sbi, "Disable nat_bits due to no space");
1335-
} else if (!is_set_ckpt_flags(sbi, CP_NAT_BITS_FLAG) &&
1336-
f2fs_nat_bitmap_enabled(sbi)) {
1337-
f2fs_enable_nat_bits(sbi);
1338-
set_ckpt_flags(sbi, CP_NAT_BITS_FLAG);
1339-
f2fs_notice(sbi, "Rebuild and enable nat_bits");
1340-
}
1341-
}
1342-
13431330
spin_lock_irqsave(&sbi->cp_lock, flags);
13441331

1332+
if ((cpc->reason & CP_UMOUNT) &&
1333+
le32_to_cpu(ckpt->cp_pack_total_block_count) >
1334+
sbi->blocks_per_seg - NM_I(sbi)->nat_bits_blocks)
1335+
disable_nat_bits(sbi, false);
1336+
13451337
if (cpc->reason & CP_TRIMMED)
13461338
__set_ckpt_flags(ckpt, CP_TRIMMED_FLAG);
13471339
else
@@ -1524,8 +1516,7 @@ static int do_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc)
15241516
start_blk = __start_cp_next_addr(sbi);
15251517

15261518
/* write nat bits */
1527-
if ((cpc->reason & CP_UMOUNT) &&
1528-
is_set_ckpt_flags(sbi, CP_NAT_BITS_FLAG)) {
1519+
if (enabled_nat_bits(sbi, cpc)) {
15291520
__u64 cp_ver = cur_cp_version(ckpt);
15301521
block_t blk;
15311522

fs/f2fs/f2fs.h

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2197,6 +2197,36 @@ static inline void f2fs_up_write(struct f2fs_rwsem *sem)
21972197
#endif
21982198
}
21992199

2200+
static inline void disable_nat_bits(struct f2fs_sb_info *sbi, bool lock)
2201+
{
2202+
unsigned long flags;
2203+
unsigned char *nat_bits;
2204+
2205+
/*
2206+
* In order to re-enable nat_bits we need to call fsck.f2fs by
2207+
* set_sbi_flag(sbi, SBI_NEED_FSCK). But it may give huge cost,
2208+
* so let's rely on regular fsck or unclean shutdown.
2209+
*/
2210+
2211+
if (lock)
2212+
spin_lock_irqsave(&sbi->cp_lock, flags);
2213+
__clear_ckpt_flags(F2FS_CKPT(sbi), CP_NAT_BITS_FLAG);
2214+
nat_bits = NM_I(sbi)->nat_bits;
2215+
NM_I(sbi)->nat_bits = NULL;
2216+
if (lock)
2217+
spin_unlock_irqrestore(&sbi->cp_lock, flags);
2218+
2219+
kvfree(nat_bits);
2220+
}
2221+
2222+
static inline bool enabled_nat_bits(struct f2fs_sb_info *sbi,
2223+
struct cp_control *cpc)
2224+
{
2225+
bool set = is_set_ckpt_flags(sbi, CP_NAT_BITS_FLAG);
2226+
2227+
return (cpc) ? (cpc->reason & CP_UMOUNT) && set : set;
2228+
}
2229+
22002230
static inline void f2fs_lock_op(struct f2fs_sb_info *sbi)
22012231
{
22022232
f2fs_down_read(&sbi->cp_rwsem);
@@ -3623,7 +3653,6 @@ int f2fs_truncate_inode_blocks(struct inode *inode, pgoff_t from);
36233653
int f2fs_truncate_xattr_node(struct inode *inode);
36243654
int f2fs_wait_on_node_pages_writeback(struct f2fs_sb_info *sbi,
36253655
unsigned int seq_id);
3626-
bool f2fs_nat_bitmap_enabled(struct f2fs_sb_info *sbi);
36273656
int f2fs_remove_inode_page(struct inode *inode);
36283657
struct page *f2fs_new_inode_page(struct inode *inode);
36293658
struct page *f2fs_new_node_page(struct dnode_of_data *dn, unsigned int ofs);
@@ -3648,7 +3677,6 @@ int f2fs_recover_xattr_data(struct inode *inode, struct page *page);
36483677
int f2fs_recover_inode_page(struct f2fs_sb_info *sbi, struct page *page);
36493678
int f2fs_restore_node_summary(struct f2fs_sb_info *sbi,
36503679
unsigned int segno, struct f2fs_summary_block *sum);
3651-
void f2fs_enable_nat_bits(struct f2fs_sb_info *sbi);
36523680
int f2fs_flush_nat_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc);
36533681
int f2fs_build_node_manager(struct f2fs_sb_info *sbi);
36543682
void f2fs_destroy_node_manager(struct f2fs_sb_info *sbi);

fs/f2fs/node.c

Lines changed: 23 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -2265,24 +2265,6 @@ static void __move_free_nid(struct f2fs_sb_info *sbi, struct free_nid *i,
22652265
}
22662266
}
22672267

2268-
bool f2fs_nat_bitmap_enabled(struct f2fs_sb_info *sbi)
2269-
{
2270-
struct f2fs_nm_info *nm_i = NM_I(sbi);
2271-
unsigned int i;
2272-
bool ret = true;
2273-
2274-
f2fs_down_read(&nm_i->nat_tree_lock);
2275-
for (i = 0; i < nm_i->nat_blocks; i++) {
2276-
if (!test_bit_le(i, nm_i->nat_block_bitmap)) {
2277-
ret = false;
2278-
break;
2279-
}
2280-
}
2281-
f2fs_up_read(&nm_i->nat_tree_lock);
2282-
2283-
return ret;
2284-
}
2285-
22862268
static void update_free_nid_bitmap(struct f2fs_sb_info *sbi, nid_t nid,
22872269
bool set, bool build)
22882270
{
@@ -2961,23 +2943,7 @@ static void __adjust_nat_entry_set(struct nat_entry_set *nes,
29612943
list_add_tail(&nes->set_list, head);
29622944
}
29632945

2964-
static void __update_nat_bits(struct f2fs_nm_info *nm_i, unsigned int nat_ofs,
2965-
unsigned int valid)
2966-
{
2967-
if (valid == 0) {
2968-
__set_bit_le(nat_ofs, nm_i->empty_nat_bits);
2969-
__clear_bit_le(nat_ofs, nm_i->full_nat_bits);
2970-
return;
2971-
}
2972-
2973-
__clear_bit_le(nat_ofs, nm_i->empty_nat_bits);
2974-
if (valid == NAT_ENTRY_PER_BLOCK)
2975-
__set_bit_le(nat_ofs, nm_i->full_nat_bits);
2976-
else
2977-
__clear_bit_le(nat_ofs, nm_i->full_nat_bits);
2978-
}
2979-
2980-
static void update_nat_bits(struct f2fs_sb_info *sbi, nid_t start_nid,
2946+
static void __update_nat_bits(struct f2fs_sb_info *sbi, nid_t start_nid,
29812947
struct page *page)
29822948
{
29832949
struct f2fs_nm_info *nm_i = NM_I(sbi);
@@ -2986,7 +2952,7 @@ static void update_nat_bits(struct f2fs_sb_info *sbi, nid_t start_nid,
29862952
int valid = 0;
29872953
int i = 0;
29882954

2989-
if (!is_set_ckpt_flags(sbi, CP_NAT_BITS_FLAG))
2955+
if (!enabled_nat_bits(sbi, NULL))
29902956
return;
29912957

29922958
if (nat_index == 0) {
@@ -2997,36 +2963,17 @@ static void update_nat_bits(struct f2fs_sb_info *sbi, nid_t start_nid,
29972963
if (le32_to_cpu(nat_blk->entries[i].block_addr) != NULL_ADDR)
29982964
valid++;
29992965
}
3000-
3001-
__update_nat_bits(nm_i, nat_index, valid);
3002-
}
3003-
3004-
void f2fs_enable_nat_bits(struct f2fs_sb_info *sbi)
3005-
{
3006-
struct f2fs_nm_info *nm_i = NM_I(sbi);
3007-
unsigned int nat_ofs;
3008-
3009-
f2fs_down_read(&nm_i->nat_tree_lock);
3010-
3011-
for (nat_ofs = 0; nat_ofs < nm_i->nat_blocks; nat_ofs++) {
3012-
unsigned int valid = 0, nid_ofs = 0;
3013-
3014-
/* handle nid zero due to it should never be used */
3015-
if (unlikely(nat_ofs == 0)) {
3016-
valid = 1;
3017-
nid_ofs = 1;
3018-
}
3019-
3020-
for (; nid_ofs < NAT_ENTRY_PER_BLOCK; nid_ofs++) {
3021-
if (!test_bit_le(nid_ofs,
3022-
nm_i->free_nid_bitmap[nat_ofs]))
3023-
valid++;
3024-
}
3025-
3026-
__update_nat_bits(nm_i, nat_ofs, valid);
2966+
if (valid == 0) {
2967+
__set_bit_le(nat_index, nm_i->empty_nat_bits);
2968+
__clear_bit_le(nat_index, nm_i->full_nat_bits);
2969+
return;
30272970
}
30282971

3029-
f2fs_up_read(&nm_i->nat_tree_lock);
2972+
__clear_bit_le(nat_index, nm_i->empty_nat_bits);
2973+
if (valid == NAT_ENTRY_PER_BLOCK)
2974+
__set_bit_le(nat_index, nm_i->full_nat_bits);
2975+
else
2976+
__clear_bit_le(nat_index, nm_i->full_nat_bits);
30302977
}
30312978

30322979
static int __flush_nat_entry_set(struct f2fs_sb_info *sbi,
@@ -3045,7 +2992,7 @@ static int __flush_nat_entry_set(struct f2fs_sb_info *sbi,
30452992
* #1, flush nat entries to journal in current hot data summary block.
30462993
* #2, flush nat entries to nat page.
30472994
*/
3048-
if ((cpc->reason & CP_UMOUNT) ||
2995+
if (enabled_nat_bits(sbi, cpc) ||
30492996
!__has_cursum_space(journal, set->entry_cnt, NAT_JOURNAL))
30502997
to_journal = false;
30512998

@@ -3092,7 +3039,7 @@ static int __flush_nat_entry_set(struct f2fs_sb_info *sbi,
30923039
if (to_journal) {
30933040
up_write(&curseg->journal_rwsem);
30943041
} else {
3095-
update_nat_bits(sbi, start_nid, page);
3042+
__update_nat_bits(sbi, start_nid, page);
30963043
f2fs_put_page(page, 1);
30973044
}
30983045

@@ -3123,7 +3070,7 @@ int f2fs_flush_nat_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc)
31233070
* during unmount, let's flush nat_bits before checking
31243071
* nat_cnt[DIRTY_NAT].
31253072
*/
3126-
if (cpc->reason & CP_UMOUNT) {
3073+
if (enabled_nat_bits(sbi, cpc)) {
31273074
f2fs_down_write(&nm_i->nat_tree_lock);
31283075
remove_nats_in_journal(sbi);
31293076
f2fs_up_write(&nm_i->nat_tree_lock);
@@ -3139,7 +3086,7 @@ int f2fs_flush_nat_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc)
31393086
* entries, remove all entries from journal and merge them
31403087
* into nat entry set.
31413088
*/
3142-
if (cpc->reason & CP_UMOUNT ||
3089+
if (enabled_nat_bits(sbi, cpc) ||
31433090
!__has_cursum_space(journal,
31443091
nm_i->nat_cnt[DIRTY_NAT], NAT_JOURNAL))
31453092
remove_nats_in_journal(sbi);
@@ -3176,18 +3123,15 @@ static int __get_nat_bitmaps(struct f2fs_sb_info *sbi)
31763123
__u64 cp_ver = cur_cp_version(ckpt);
31773124
block_t nat_bits_addr;
31783125

3126+
if (!enabled_nat_bits(sbi, NULL))
3127+
return 0;
3128+
31793129
nm_i->nat_bits_blocks = F2FS_BLK_ALIGN((nat_bits_bytes << 1) + 8);
31803130
nm_i->nat_bits = f2fs_kvzalloc(sbi,
31813131
nm_i->nat_bits_blocks << F2FS_BLKSIZE_BITS, GFP_KERNEL);
31823132
if (!nm_i->nat_bits)
31833133
return -ENOMEM;
31843134

3185-
nm_i->full_nat_bits = nm_i->nat_bits + 8;
3186-
nm_i->empty_nat_bits = nm_i->full_nat_bits + nat_bits_bytes;
3187-
3188-
if (!is_set_ckpt_flags(sbi, CP_NAT_BITS_FLAG))
3189-
return 0;
3190-
31913135
nat_bits_addr = __start_cp_addr(sbi) + BLKS_PER_SEG(sbi) -
31923136
nm_i->nat_bits_blocks;
31933137
for (i = 0; i < nm_i->nat_bits_blocks; i++) {
@@ -3204,12 +3148,13 @@ static int __get_nat_bitmaps(struct f2fs_sb_info *sbi)
32043148

32053149
cp_ver |= (cur_cp_crc(ckpt) << 32);
32063150
if (cpu_to_le64(cp_ver) != *(__le64 *)nm_i->nat_bits) {
3207-
clear_ckpt_flags(sbi, CP_NAT_BITS_FLAG);
3208-
f2fs_notice(sbi, "Disable nat_bits due to incorrect cp_ver (%llu, %llu)",
3209-
cp_ver, le64_to_cpu(*(__le64 *)nm_i->nat_bits));
3151+
disable_nat_bits(sbi, true);
32103152
return 0;
32113153
}
32123154

3155+
nm_i->full_nat_bits = nm_i->nat_bits + 8;
3156+
nm_i->empty_nat_bits = nm_i->full_nat_bits + nat_bits_bytes;
3157+
32133158
f2fs_notice(sbi, "Found nat_bits in checkpoint");
32143159
return 0;
32153160
}
@@ -3220,7 +3165,7 @@ static inline void load_free_nid_bitmap(struct f2fs_sb_info *sbi)
32203165
unsigned int i = 0;
32213166
nid_t nid, last_nid;
32223167

3223-
if (!is_set_ckpt_flags(sbi, CP_NAT_BITS_FLAG))
3168+
if (!enabled_nat_bits(sbi, NULL))
32243169
return;
32253170

32263171
for (i = 0; i < nm_i->nat_blocks; i++) {

0 commit comments

Comments
 (0)