I think my optimization makes mkfs.f2fs faster in case of invalid volume size. So with the commit user will get err faster. Before start I suggest add debug printf() to `f2fs_fs.h` like this: ``` for (; candidate <= end; candidate += diff) { reserved = get_reserved(sb, candidate); ovp = (usable_main_segs - reserved) * candidate / 100; MSG(0, "ovp=%f usable_main_segs=%u reserved=%u candidate=%f\n", ovp, usable_main_segs, reserved, candidate); //debug printf() if (ovp <= 0) continue; space = usable_main_segs - max((double)reserved, ovp) - overprovision_segment_buffer(sb); MSG(0, "space=%f max_space=%f\n", space, max_space); //debug printf() if (max_space < space) { max_space = space; max_ovp = candidate; } } ```
Test instruction is based on "boot/grub2/readme.txt" https://gitlab.com/buildroot.org/buildroot/-/blob/master/boot/grub2/readme.txt You can use Ubuntu 24 or similar OS. 1. Create a disk image ``` cd /tmp dd if=/dev/zero of=disk.img bs=1M count=32 ``` 2. Partition it with GPT partitions usinig `cgdisk disk.img` or ``` parted --script disk.img mklabel gpt mkpart primary 1MiB 31MiB ``` 3. Setup loop device and loop partitions ``` loop_dev=$(sudo losetup -f --show disk.img) sudo partx -a "$loop_dev" ``` 5. Prepare the root partition ``` sudo mkfs.f2fs -f -l mylable123 -i -O extra_attr,inode_checksum,sb_checksum,compression -e raw -E bin "$loop_dev" ``` 6. Cleanup loop device ``` partx -d "$loop_dev" losetup -d "$loop_dev" ``` In log you can see that for ovp==0.0 space calculation looks not necessary... ``` a@Linux:~$ sudo mkfs.f2fs -f -l mylable123 -i -O extra_attr,inode_checksum,sb_checksum,compression -e raw -E bin "$loop_dev" F2FS-tools: mkfs.f2fs Ver: 1.16.0 (2025-05-06) Info: Debug level = 0 Info: Add new cold file extension list Info: Add new hot file extension list Info: Label = mylable123 Info: Trim is enabled Info: Enable Compression Info: Segments per section = 1 Info: Sections per zone = 1 Info: sector size = 512 Info: total sectors = 65536 (32 MB) Info: zone aligned segment0 blkaddr: 512 ovp=429496728.700000 usable_main_segs=8 reserved=17 candidate=10.000000 space=-429496726.700000 max_space=0.000000 ovp=644245093.650000 usable_main_segs=8 reserved=13 candidate=15.000000 space=-644245091.650000 max_space=0.000000 ovp=858993458.400000 usable_main_segs=8 reserved=12 candidate=20.000000 space=-858993456.400000 max_space=0.000000 ovp=1073741823.250000 usable_main_segs=8 reserved=11 candidate=25.000000 space=-1073741821.250000 max_space=0.000000 ovp=1288490188.200000 usable_main_segs=8 reserved=10 candidate=30.000000 space=-1288490186.200000 max_space=0.000000 ovp=1503238553.250000 usable_main_segs=8 reserved=9 candidate=35.000000 space=-1503238551.250000 max_space=0.000000 ovp=1717986918.000000 usable_main_segs=8 reserved=9 candidate=40.000000 space=-1717986916.000000 max_space=0.000000 ovp=1932735282.750000 usable_main_segs=8 reserved=9 candidate=45.000000 space=-1932735280.750000 max_space=0.000000 ovp=2147483647.500000 usable_main_segs=8 reserved=9 candidate=50.000000 space=-2147483645.500000 max_space=0.000000 ovp=0.000000 usable_main_segs=8 reserved=8 candidate=55.000000 space=-6.000000 max_space=0.000000 ovp=0.000000 usable_main_segs=8 reserved=8 candidate=60.000000 space=-6.000000 max_space=0.000000 ovp=0.000000 usable_main_segs=8 reserved=8 candidate=65.000000 space=-6.000000 max_space=0.000000 ovp=0.000000 usable_main_segs=8 reserved=8 candidate=70.000000 space=-6.000000 max_space=0.000000 ovp=0.000000 usable_main_segs=8 reserved=8 candidate=75.000000 space=-6.000000 max_space=0.000000 ovp=0.000000 usable_main_segs=8 reserved=8 candidate=80.000000 space=-6.000000 max_space=0.000000 ovp=0.000000 usable_main_segs=8 reserved=8 candidate=85.000000 space=-6.000000 max_space=0.000000 ovp=0.000000 usable_main_segs=8 reserved=8 candidate=90.000000 space=-6.000000 max_space=0.000000 ovp=0.000000 usable_main_segs=8 reserved=8 candidate=95.000000 space=-6.000000 max_space=0.000000 Error: Device size is not sufficient for F2FS volume Error: Failed to prepare a super block!!! Error: Could not format the device!!! ``` Signed-off-by: Cherniaev Andrei <dungeonlords...@naver.com> --- include/f2fs_fs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h index f7268d1..41755af 100644 --- a/include/f2fs_fs.h +++ b/include/f2fs_fs.h @@ -1891,7 +1891,7 @@ static inline double get_best_overprovision(struct f2fs_super_block *sb) for (; candidate <= end; candidate += diff) { reserved = get_reserved(sb, candidate); ovp = (usable_main_segs - reserved) * candidate / 100; - if (ovp < 0) + if (ovp <= 0) continue; space = usable_main_segs - max((double)reserved, ovp) - overprovision_segment_buffer(sb); -- 2.45.2 _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel