aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk@kernel.org>2024-02-23 17:13:19 -0800
committerJaegeuk Kim <jaegeuk@kernel.org>2024-03-08 13:34:51 -0800
commitdc03566da7b870d7062732e4b357ed7df9024f98 (patch)
treecba98ab760785e585a4521ecd33dbb159725c06e
parentefcff4bc169fbcb7276769ab0ad5444b1df33a70 (diff)
downloadf2fs-tools-dc03566da7b870d7062732e4b357ed7df9024f98.tar.gz
mkfs.f2fs: should give section-aligned reserved segments
The reserved segments should be aligned to the section boundary. Reviewed-by: Daeho Jeong <daehojeong@google.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
-rw-r--r--include/f2fs_fs.h12
1 files changed, 7 insertions, 5 deletions
diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
index 9056e02..fc56396 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;