f2fs: fix potential overflow
Chao Yu
maintainerPATCH 1/1 f2fs: fix potential overflow
From: Chao Yu <[email protected]>
In build_sit_entries(), if valid_blocks in SIT block is smaller than valid_blocks in journal, for below calculation:
sbi->discard_blks += old_valid_blocks - se->valid_blocks;
There will be two times potential overflow:
- old_valid_blocks - se->valid_blocks will overflow, and be a very large number.
- sbi->discard_blks += result will overflow again, comes out a correct result accidently.
Anyway, it should be fixed.
Fixes d600af236da5 ("f2fs: avoid unneeded loop in build_sit_entries")
Fixes 1f43e2ad7bff ("f2fs: introduce CP_TRIMMED_FLAG to avoid unneeded discard")
Signed-off-by Chao Yu <[email protected]>
--- fs/f2fs/segment.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
fs/f2fs/segment.c +7 -4
@@ -3692,14 +3692,17 @@ static int build_sit_entries(struct f2fs_sb_info *sbi) }else {memcpy (se->discard_map, se->cur_valid_map,SIT_VBLOCK_MAP_SIZE ); - sbi->discard_blks += old_valid_blocks - - se->valid_blocks; + sbi->discard_blks += old_valid_blocks; + sbi->discard_blks -= se->valid_blocks; } } -if (sbi->segs_per_sec >1 ) +if (sbi->segs_per_sec >1 ) {get_sec_entry (sbi, start)->valid_blocks += - se->valid_blocks - old_valid_blocks; + se->valid_blocks; +get_sec_entry (sbi, start)->valid_blocks -= + old_valid_blocks; + } }up_read (&curseg->journal_rwsem);
Signature · 1 line
2.16.2.17.g38e79b1fd