|
@@ -547,8 +547,9 @@ static inline void check_block_count(struct f2fs_sb_info *sbi,
|
|
|
{
|
|
|
struct f2fs_sm_info *sm_info = SM_I(sbi);
|
|
|
unsigned int end_segno = sm_info->segment_count - 1;
|
|
|
+ bool is_valid = test_bit_le(0, raw_sit->valid_map) ? true : false;
|
|
|
int valid_blocks = 0;
|
|
|
- int i;
|
|
|
+ int cur_pos = 0, next_pos;
|
|
|
|
|
|
/* check segment usage */
|
|
|
BUG_ON(GET_SIT_VBLOCKS(raw_sit) > sbi->blocks_per_seg);
|
|
@@ -557,9 +558,19 @@ static inline void check_block_count(struct f2fs_sb_info *sbi,
|
|
|
BUG_ON(segno > end_segno);
|
|
|
|
|
|
/* check bitmap with valid block count */
|
|
|
- for (i = 0; i < sbi->blocks_per_seg; i++)
|
|
|
- if (f2fs_test_bit(i, raw_sit->valid_map))
|
|
|
- valid_blocks++;
|
|
|
+ do {
|
|
|
+ if (is_valid) {
|
|
|
+ next_pos = find_next_zero_bit_le(&raw_sit->valid_map,
|
|
|
+ sbi->blocks_per_seg,
|
|
|
+ cur_pos);
|
|
|
+ valid_blocks += next_pos - cur_pos;
|
|
|
+ } else
|
|
|
+ next_pos = find_next_bit_le(&raw_sit->valid_map,
|
|
|
+ sbi->blocks_per_seg,
|
|
|
+ cur_pos);
|
|
|
+ cur_pos = next_pos;
|
|
|
+ is_valid = !is_valid;
|
|
|
+ } while (cur_pos < sbi->blocks_per_seg);
|
|
|
BUG_ON(GET_SIT_VBLOCKS(raw_sit) != valid_blocks);
|
|
|
}
|
|
|
#else
|