@@ -2277,24 +2277,6 @@ static void __move_free_nid(struct f2fs_sb_info *sbi, struct free_nid *i,
2277
2277
}
2278
2278
}
2279
2279
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
-
2298
2280
static void update_free_nid_bitmap (struct f2fs_sb_info * sbi , nid_t nid ,
2299
2281
bool set , bool build )
2300
2282
{
@@ -2973,23 +2955,7 @@ static void __adjust_nat_entry_set(struct nat_entry_set *nes,
2973
2955
list_add_tail (& nes -> set_list , head );
2974
2956
}
2975
2957
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 ,
2993
2959
struct page * page )
2994
2960
{
2995
2961
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,
2998
2964
int valid = 0 ;
2999
2965
int i = 0 ;
3000
2966
3001
- if (!is_set_ckpt_flags (sbi , CP_NAT_BITS_FLAG ))
2967
+ if (!enabled_nat_bits (sbi , NULL ))
3002
2968
return ;
3003
2969
3004
2970
if (nat_index == 0 ) {
@@ -3009,36 +2975,17 @@ static void update_nat_bits(struct f2fs_sb_info *sbi, nid_t start_nid,
3009
2975
if (le32_to_cpu (nat_blk -> entries [i ].block_addr ) != NULL_ADDR )
3010
2976
valid ++ ;
3011
2977
}
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 ;
3039
2982
}
3040
2983
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 );
3042
2989
}
3043
2990
3044
2991
static 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,
3057
3004
* #1, flush nat entries to journal in current hot data summary block.
3058
3005
* #2, flush nat entries to nat page.
3059
3006
*/
3060
- if (( cpc -> reason & CP_UMOUNT ) ||
3007
+ if (enabled_nat_bits ( sbi , cpc ) ||
3061
3008
!__has_cursum_space (journal , set -> entry_cnt , NAT_JOURNAL ))
3062
3009
to_journal = false;
3063
3010
@@ -3104,7 +3051,7 @@ static int __flush_nat_entry_set(struct f2fs_sb_info *sbi,
3104
3051
if (to_journal ) {
3105
3052
up_write (& curseg -> journal_rwsem );
3106
3053
} else {
3107
- update_nat_bits (sbi , start_nid , page );
3054
+ __update_nat_bits (sbi , start_nid , page );
3108
3055
f2fs_put_page (page , 1 );
3109
3056
}
3110
3057
@@ -3135,7 +3082,7 @@ int f2fs_flush_nat_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc)
3135
3082
* during unmount, let's flush nat_bits before checking
3136
3083
* nat_cnt[DIRTY_NAT].
3137
3084
*/
3138
- if (cpc -> reason & CP_UMOUNT ) {
3085
+ if (enabled_nat_bits ( sbi , cpc ) ) {
3139
3086
f2fs_down_write (& nm_i -> nat_tree_lock );
3140
3087
remove_nats_in_journal (sbi );
3141
3088
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)
3151
3098
* entries, remove all entries from journal and merge them
3152
3099
* into nat entry set.
3153
3100
*/
3154
- if (cpc -> reason & CP_UMOUNT ||
3101
+ if (enabled_nat_bits ( sbi , cpc ) ||
3155
3102
!__has_cursum_space (journal ,
3156
3103
nm_i -> nat_cnt [DIRTY_NAT ], NAT_JOURNAL ))
3157
3104
remove_nats_in_journal (sbi );
@@ -3188,18 +3135,15 @@ static int __get_nat_bitmaps(struct f2fs_sb_info *sbi)
3188
3135
__u64 cp_ver = cur_cp_version (ckpt );
3189
3136
block_t nat_bits_addr ;
3190
3137
3138
+ if (!enabled_nat_bits (sbi , NULL ))
3139
+ return 0 ;
3140
+
3191
3141
nm_i -> nat_bits_blocks = F2FS_BLK_ALIGN ((nat_bits_bytes << 1 ) + 8 );
3192
3142
nm_i -> nat_bits = f2fs_kvzalloc (sbi ,
3193
3143
F2FS_BLK_TO_BYTES (nm_i -> nat_bits_blocks ), GFP_KERNEL );
3194
3144
if (!nm_i -> nat_bits )
3195
3145
return - ENOMEM ;
3196
3146
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
-
3203
3147
nat_bits_addr = __start_cp_addr (sbi ) + BLKS_PER_SEG (sbi ) -
3204
3148
nm_i -> nat_bits_blocks ;
3205
3149
for (i = 0 ; i < nm_i -> nat_bits_blocks ; i ++ ) {
@@ -3216,12 +3160,13 @@ static int __get_nat_bitmaps(struct f2fs_sb_info *sbi)
3216
3160
3217
3161
cp_ver |= (cur_cp_crc (ckpt ) << 32 );
3218
3162
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);
3222
3164
return 0 ;
3223
3165
}
3224
3166
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
+
3225
3170
f2fs_notice (sbi , "Found nat_bits in checkpoint" );
3226
3171
return 0 ;
3227
3172
}
@@ -3232,7 +3177,7 @@ static inline void load_free_nid_bitmap(struct f2fs_sb_info *sbi)
3232
3177
unsigned int i = 0 ;
3233
3178
nid_t nid , last_nid ;
3234
3179
3235
- if (!is_set_ckpt_flags (sbi , CP_NAT_BITS_FLAG ))
3180
+ if (!enabled_nat_bits (sbi , NULL ))
3236
3181
return ;
3237
3182
3238
3183
for (i = 0 ; i < nm_i -> nat_blocks ; i ++ ) {
0 commit comments