@@ -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-
22862268static 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
30322979static 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