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

Reply via email to