fsck.f2fs: fix to maintain ckpt_valid_blocks correctly

When need_fsync_data_record() is true (e.g. after sudden power-off or
shutdown), get_seg_vblocks() returns se->ckpt_valid_blocks.

In reserve_new_block(), se->ckpt_valid_blocks is correctly incremented
along with setting the bit in se->ckpt_valid_map. However, in
update_block() and release_block(), while se->ckpt_valid_map is updated,
se->ckpt_valid_blocks is never incremented or decremented.

As a result, if blocks in an empty segment are newly allocated or migrated
by fsck (e.g. during quota rebuild), se->ckpt_valid_blocks remains 0.
Subsequent calls to get_seg_vblocks() will treat the segment as completely
empty, leading to false free segment detection or incorrect section reuse.

Fix this by maintaining se->ckpt_valid_blocks alongside se->ckpt_valid_map
in update_block() and release_block().

Fixes: 10dad5ed7ce1 ("f2fs-tools: support zoned ufs devices")
Signed-off-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2 files changed