On 10/20, Shinichiro Kawasaki wrote: > On Oct 10, 2022 / 15:15, Jaegeuk Kim wrote: > > As f2fs becomes more resilient for GCs, let's give the marginal > > overprovision > > space back to user. > > > > Signed-off-by: Jaegeuk Kim <[email protected]> > > Hello Jaegeuk, > > Using the dev branch of f2fs-tools repo, I observed mkfs.f2fs failure with > zoned > block devices: > > Error: Device size is not sufficient for F2FS volume > > I found this patch in the branch triggers it. I also observed the same failure > is observed with non- zoned regular block devices when I specify -s options to > mkfs.f2fs command. With these conditions, number of segments in each section > is > not zero, and it increases the number of reserved segments. My understanding > is > that it makes reserved segments larger than overprovisioning segments all the > time in the loop of get_best_overprovision(). Then get_best_overprovision() > returns 0% overprovisioning ratio. Hence the error. > > Could you take a look for fix?
Thanks, I think that fix looks good to me. I applied into the original patch. https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs-tools.git/commit/?h=dev&id=281d3e72370f6c39c0d57acaf37a7f0e003ddd28 > > FYI, I tried to fix and created a patch which allows reserved segments larger > than overprovisioning segments [1]. It compares those two, and take larger one > to subtract from usable segments to get the segments for users. I confirmed it > keeps small number of overprovisioning segments for no -s option case, and > avoids the mkfs.f2fs failure for the -s option and zoned block device cases. > However, it increases runtime of my test script which fills f2fs and do file > overwrites to test f2fs GC on zoned block devices. It takes +60% longer > runtime. > Then GC performance looks worse than before, and this fix does not look good > for me. I think you can try to avoid that by tuning /sys/fs/f2fs/xx/reserved_blocks? > > [1] > > diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h > index 8ca574a..4902953 100644 > --- a/include/f2fs_fs.h > +++ b/include/f2fs_fs.h > @@ -1634,9 +1634,10 @@ static inline double get_best_overprovision(struct > f2fs_super_block *sb) > reserved = (100 / candidate + 1 + NR_CURSEG_TYPE) * > round_up(usable_main_segs, > get_sb(section_count)); > ovp = (usable_main_segs - reserved) * candidate / 100; > - if (reserved >= ovp) > + if (ovp < 0) > continue; > - space = usable_main_segs - ovp; > + > + space = usable_main_segs - max(reserved, ovp); > if (max_space < space) { > max_space = space; > max_ovp = candidate; > diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c > index c314d1c..08f4e66 100644 > --- a/mkfs/f2fs_format.c > +++ b/mkfs/f2fs_format.c > @@ -764,11 +764,8 @@ static int f2fs_write_check_point_pack(void) > set_cp(overprov_segment_count, (f2fs_get_usable_segments(sb) - > get_cp(rsvd_segment_count)) * > c.overprovision / 100); > - > - if (get_cp(rsvd_segment_count) > get_cp(overprov_segment_count)) { > - MSG(0, "\tError: Wrong overprovision ratio\n"); > - goto free_cp_payload; > - } > + if (get_cp(overprov_segment_count) < get_cp(rsvd_segment_count)) > + set_cp(overprov_segment_count, get_cp(rsvd_segment_count)); > > if (f2fs_get_usable_segments(sb) <= get_cp(overprov_segment_count)) { > MSG(0, "\tError: Not enough segments to create F2FS Volume\n"); > > -- > Shin'ichiro Kawasaki _______________________________________________ Linux-f2fs-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
