The reserved segments should be aligned to the section boundary. Signed-off-by: Jaegeuk Kim <jaeg...@kernel.org> ---
v2: - fix bug include/f2fs_fs.h | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h index 9056e02acd29..fc56396fa358 100644 --- a/include/f2fs_fs.h +++ b/include/f2fs_fs.h @@ -1760,25 +1760,27 @@ extern uint32_t f2fs_get_usable_segments(struct f2fs_super_block *sb); #define ZONE_ALIGN(blks) SIZE_ALIGN(blks, c.blks_per_seg * \ c.segs_per_zone) -static inline double get_reserved(struct f2fs_super_block *sb, double ovp) +static inline uint32_t get_reserved(struct f2fs_super_block *sb, double ovp) { - double reserved; uint32_t usable_main_segs = f2fs_get_usable_segments(sb); uint32_t segs_per_sec = round_up(usable_main_segs, get_sb(section_count)); + uint32_t reserved; if (c.conf_reserved_sections) reserved = c.conf_reserved_sections * segs_per_sec; else reserved = (100 / ovp + 1 + NR_CURSEG_TYPE) * segs_per_sec; - return reserved; + /* Let's keep the section alignment */ + return round_up(reserved, segs_per_sec) * segs_per_sec; } static inline double get_best_overprovision(struct f2fs_super_block *sb) { - double reserved, ovp, candidate, end, diff, space; + double ovp, candidate, end, diff, space; double max_ovp = 0, max_space = 0; uint32_t usable_main_segs = f2fs_get_usable_segments(sb); + uint32_t reserved; if (get_sb(segment_count_main) < 256) { candidate = 10; @@ -1795,7 +1797,7 @@ static inline double get_best_overprovision(struct f2fs_super_block *sb) ovp = (usable_main_segs - reserved) * candidate / 100; if (ovp < 0) continue; - space = usable_main_segs - max(reserved, ovp) - + space = usable_main_segs - max((double)reserved, ovp) - 2 * get_sb(segs_per_sec); if (max_space < space) { max_space = space; -- 2.44.0.rc0.258.g7320e95886-goog _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel