@@ -2277,24 +2277,6 @@ static void __move_free_nid(struct f2fs_sb_info *sbi, struct free_nid *i,
22772277 }
22782278}
22792279
2280- bool f2fs_nat_bitmap_enabled (struct f2fs_sb_info * sbi )
2281- {
2282- struct f2fs_nm_info * nm_i = NM_I (sbi );
2283- unsigned int i ;
2284- bool ret = true;
2285-
2286- f2fs_down_read (& nm_i -> nat_tree_lock );
2287- for (i = 0 ; i < nm_i -> nat_blocks ; i ++ ) {
2288- if (!test_bit_le (i , nm_i -> nat_block_bitmap )) {
2289- ret = false;
2290- break ;
2291- }
2292- }
2293- f2fs_up_read (& nm_i -> nat_tree_lock );
2294-
2295- return ret ;
2296- }
2297-
22982280static void update_free_nid_bitmap (struct f2fs_sb_info * sbi , nid_t nid ,
22992281 bool set , bool build )
23002282{
@@ -2973,23 +2955,7 @@ static void __adjust_nat_entry_set(struct nat_entry_set *nes,
29732955 list_add_tail (& nes -> set_list , head );
29742956}
29752957
2976- static void __update_nat_bits (struct f2fs_nm_info * nm_i , unsigned int nat_ofs ,
2977- unsigned int valid )
2978- {
2979- if (valid == 0 ) {
2980- __set_bit_le (nat_ofs , nm_i -> empty_nat_bits );
2981- __clear_bit_le (nat_ofs , nm_i -> full_nat_bits );
2982- return ;
2983- }
2984-
2985- __clear_bit_le (nat_ofs , nm_i -> empty_nat_bits );
2986- if (valid == NAT_ENTRY_PER_BLOCK )
2987- __set_bit_le (nat_ofs , nm_i -> full_nat_bits );
2988- else
2989- __clear_bit_le (nat_ofs , nm_i -> full_nat_bits );
2990- }
2991-
2992- static void update_nat_bits (struct f2fs_sb_info * sbi , nid_t start_nid ,
2958+ static void __update_nat_bits (struct f2fs_sb_info * sbi , nid_t start_nid ,
29932959 struct page * page )
29942960{
29952961 struct f2fs_nm_info * nm_i = NM_I (sbi );
@@ -2998,7 +2964,7 @@ static void update_nat_bits(struct f2fs_sb_info *sbi, nid_t start_nid,
29982964 int valid = 0 ;
29992965 int i = 0 ;
30002966
3001- if (!is_set_ckpt_flags (sbi , CP_NAT_BITS_FLAG ))
2967+ if (!enabled_nat_bits (sbi , NULL ))
30022968 return ;
30032969
30042970 if (nat_index == 0 ) {
@@ -3009,36 +2975,17 @@ static void update_nat_bits(struct f2fs_sb_info *sbi, nid_t start_nid,
30092975 if (le32_to_cpu (nat_blk -> entries [i ].block_addr ) != NULL_ADDR )
30102976 valid ++ ;
30112977 }
3012-
3013- __update_nat_bits (nm_i , nat_index , valid );
3014- }
3015-
3016- void f2fs_enable_nat_bits (struct f2fs_sb_info * sbi )
3017- {
3018- struct f2fs_nm_info * nm_i = NM_I (sbi );
3019- unsigned int nat_ofs ;
3020-
3021- f2fs_down_read (& nm_i -> nat_tree_lock );
3022-
3023- for (nat_ofs = 0 ; nat_ofs < nm_i -> nat_blocks ; nat_ofs ++ ) {
3024- unsigned int valid = 0 , nid_ofs = 0 ;
3025-
3026- /* handle nid zero due to it should never be used */
3027- if (unlikely (nat_ofs == 0 )) {
3028- valid = 1 ;
3029- nid_ofs = 1 ;
3030- }
3031-
3032- for (; nid_ofs < NAT_ENTRY_PER_BLOCK ; nid_ofs ++ ) {
3033- if (!test_bit_le (nid_ofs ,
3034- nm_i -> free_nid_bitmap [nat_ofs ]))
3035- valid ++ ;
3036- }
3037-
3038- __update_nat_bits (nm_i , nat_ofs , valid );
2978+ if (valid == 0 ) {
2979+ __set_bit_le (nat_index , nm_i -> empty_nat_bits );
2980+ __clear_bit_le (nat_index , nm_i -> full_nat_bits );
2981+ return ;
30392982 }
30402983
3041- f2fs_up_read (& nm_i -> nat_tree_lock );
2984+ __clear_bit_le (nat_index , nm_i -> empty_nat_bits );
2985+ if (valid == NAT_ENTRY_PER_BLOCK )
2986+ __set_bit_le (nat_index , nm_i -> full_nat_bits );
2987+ else
2988+ __clear_bit_le (nat_index , nm_i -> full_nat_bits );
30422989}
30432990
30442991static int __flush_nat_entry_set (struct f2fs_sb_info * sbi ,
@@ -3057,7 +3004,7 @@ static int __flush_nat_entry_set(struct f2fs_sb_info *sbi,
30573004 * #1, flush nat entries to journal in current hot data summary block.
30583005 * #2, flush nat entries to nat page.
30593006 */
3060- if (( cpc -> reason & CP_UMOUNT ) ||
3007+ if (enabled_nat_bits ( sbi , cpc ) ||
30613008 !__has_cursum_space (journal , set -> entry_cnt , NAT_JOURNAL ))
30623009 to_journal = false;
30633010
@@ -3104,7 +3051,7 @@ static int __flush_nat_entry_set(struct f2fs_sb_info *sbi,
31043051 if (to_journal ) {
31053052 up_write (& curseg -> journal_rwsem );
31063053 } else {
3107- update_nat_bits (sbi , start_nid , page );
3054+ __update_nat_bits (sbi , start_nid , page );
31083055 f2fs_put_page (page , 1 );
31093056 }
31103057
@@ -3135,7 +3082,7 @@ int f2fs_flush_nat_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc)
31353082 * during unmount, let's flush nat_bits before checking
31363083 * nat_cnt[DIRTY_NAT].
31373084 */
3138- if (cpc -> reason & CP_UMOUNT ) {
3085+ if (enabled_nat_bits ( sbi , cpc ) ) {
31393086 f2fs_down_write (& nm_i -> nat_tree_lock );
31403087 remove_nats_in_journal (sbi );
31413088 f2fs_up_write (& nm_i -> nat_tree_lock );
@@ -3151,7 +3098,7 @@ int f2fs_flush_nat_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc)
31513098 * entries, remove all entries from journal and merge them
31523099 * into nat entry set.
31533100 */
3154- if (cpc -> reason & CP_UMOUNT ||
3101+ if (enabled_nat_bits ( sbi , cpc ) ||
31553102 !__has_cursum_space (journal ,
31563103 nm_i -> nat_cnt [DIRTY_NAT ], NAT_JOURNAL ))
31573104 remove_nats_in_journal (sbi );
@@ -3188,18 +3135,15 @@ static int __get_nat_bitmaps(struct f2fs_sb_info *sbi)
31883135 __u64 cp_ver = cur_cp_version (ckpt );
31893136 block_t nat_bits_addr ;
31903137
3138+ if (!enabled_nat_bits (sbi , NULL ))
3139+ return 0 ;
3140+
31913141 nm_i -> nat_bits_blocks = F2FS_BLK_ALIGN ((nat_bits_bytes << 1 ) + 8 );
31923142 nm_i -> nat_bits = f2fs_kvzalloc (sbi ,
31933143 F2FS_BLK_TO_BYTES (nm_i -> nat_bits_blocks ), GFP_KERNEL );
31943144 if (!nm_i -> nat_bits )
31953145 return - ENOMEM ;
31963146
3197- nm_i -> full_nat_bits = nm_i -> nat_bits + 8 ;
3198- nm_i -> empty_nat_bits = nm_i -> full_nat_bits + nat_bits_bytes ;
3199-
3200- if (!is_set_ckpt_flags (sbi , CP_NAT_BITS_FLAG ))
3201- return 0 ;
3202-
32033147 nat_bits_addr = __start_cp_addr (sbi ) + BLKS_PER_SEG (sbi ) -
32043148 nm_i -> nat_bits_blocks ;
32053149 for (i = 0 ; i < nm_i -> nat_bits_blocks ; i ++ ) {
@@ -3216,12 +3160,13 @@ static int __get_nat_bitmaps(struct f2fs_sb_info *sbi)
32163160
32173161 cp_ver |= (cur_cp_crc (ckpt ) << 32 );
32183162 if (cpu_to_le64 (cp_ver ) != * (__le64 * )nm_i -> nat_bits ) {
3219- clear_ckpt_flags (sbi , CP_NAT_BITS_FLAG );
3220- f2fs_notice (sbi , "Disable nat_bits due to incorrect cp_ver (%llu, %llu)" ,
3221- cp_ver , le64_to_cpu (* (__le64 * )nm_i -> nat_bits ));
3163+ disable_nat_bits (sbi , true);
32223164 return 0 ;
32233165 }
32243166
3167+ nm_i -> full_nat_bits = nm_i -> nat_bits + 8 ;
3168+ nm_i -> empty_nat_bits = nm_i -> full_nat_bits + nat_bits_bytes ;
3169+
32253170 f2fs_notice (sbi , "Found nat_bits in checkpoint" );
32263171 return 0 ;
32273172}
@@ -3232,7 +3177,7 @@ static inline void load_free_nid_bitmap(struct f2fs_sb_info *sbi)
32323177 unsigned int i = 0 ;
32333178 nid_t nid , last_nid ;
32343179
3235- if (!is_set_ckpt_flags (sbi , CP_NAT_BITS_FLAG ))
3180+ if (!enabled_nat_bits (sbi , NULL ))
32363181 return ;
32373182
32383183 for (i = 0 ; i < nm_i -> nat_blocks ; i ++ ) {
0 commit comments