In the Linux kernel, the following vulnerability has been resolved:
f2fs: fix to trigger foreground gc during f2fsmapblocks() in lfs mode
w/ "mode=lfs" mount option, generic/299 will cause system panic as below:
------------[ cut here ]------------ kernel BUG at fs/f2fs/segment.c:2835! Call Trace: <TASK> f2fsallocatedatablock+0x6f4/0xc50 f2fsmapblocks+0x970/0x1550 f2fsiomapbegin+0xb2/0x1e0 iomapiter+0x1d6/0x430 _iomapdiorw+0x208/0x9a0 f2fsfilewriteiter+0x6b3/0xfa0 aiowrite+0x15d/0x2e0 iosubmitone+0x55e/0xab0 _x64sysiosubmit+0xa5/0x230 dosyscall64+0x84/0x2f0 entrySYSCALL64afterhwframe+0x76/0x7e RIP: 0010:newcurseg+0x70f/0x720
The root cause of we run out-of-space is: in f2fsmapblocks(), f2fs may trigger foreground gc only if it allocates any physical block, it will be a little bit later when there is multiple threads writing data w/ aio/dio/bufio method in parallel, since we always use OPU in lfs mode, so f2fsmapblocks() does block allocations aggressively.
In order to fix this issue, let's give a chance to trigger foreground gc in prior to block allocation in f2fsmapblocks().