linux/fs/f2fs
Chao Yu 82765ce5c7 f2fs: fix to trigger foreground gc during f2fs_map_blocks() in lfs mode
[ Upstream commit 1005a3ca28 ]

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>
 f2fs_allocate_data_block+0x6f4/0xc50
 f2fs_map_blocks+0x970/0x1550
 f2fs_iomap_begin+0xb2/0x1e0
 iomap_iter+0x1d6/0x430
 __iomap_dio_rw+0x208/0x9a0
 f2fs_file_write_iter+0x6b3/0xfa0
 aio_write+0x15d/0x2e0
 io_submit_one+0x55e/0xab0
 __x64_sys_io_submit+0xa5/0x230
 do_syscall_64+0x84/0x2f0
 entry_SYSCALL_64_after_hwframe+0x76/0x7e
RIP: 0010:new_curseg+0x70f/0x720

The root cause of we run out-of-space is: in f2fs_map_blocks(), 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
f2fs_map_blocks() 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 f2fs_map_blocks().

Fixes: 36abef4e79 ("f2fs: introduce mode=lfs mount option")
Cc: Daeho Jeong <daehojeong@google.com>
Signed-off-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
History 2025-08-15 12:14:02 +02:00
..
acl.c f2fs: Use in_group_or_capable() helper 2024-06-25 11:15:48 +02:00
acl.h fs: port ->set_acl() to pass mnt_idmap 2023-01-19 09:24:27 +01:00
checkpoint.c Revert "f2fs: rebuild nat_bits during umount" 2025-04-20 10:15:20 +02:00
compress.c f2fs: use vmalloc instead of kvmalloc in .init_{,de}compress_ctx 2025-06-27 11:11:28 +01:00
data.c f2fs: fix to trigger foreground gc during f2fs_map_blocks() in lfs mode 2025-08-15 12:14:02 +02:00
debug.c f2fs: clean up val{>>,<<}F2FS_BLKSIZE_BITS 2024-08-21 00:56:27 +00:00
dir.c f2fs: Introduce linear search for dentries 2025-02-08 09:58:11 +01:00
extent_cache.c f2fs: fix KMSAN uninit-value in extent_info usage 2025-08-15 12:14:00 +02:00
f2fs.h f2fs: fix to avoid out-of-boundary access in devs.path 2025-08-15 12:14:01 +02:00
file.c f2fs: decrease spare area for pinned files for zoned devices 2025-07-10 16:04:59 +02:00
gc.c f2fs: turn off one_time when forcibly set to foreground GC 2025-08-15 12:14:00 +02:00
gc.h f2fs: decrease spare area for pinned files for zoned devices 2025-07-10 16:04:59 +02:00
hash.c f2fs: don't use casefolded comparison for "." and ".." 2022-05-17 11:19:23 -07:00
inline.c f2fs: Introduce linear search for dentries 2025-02-08 09:58:11 +01:00
inode.c f2fs: fix to avoid panic in f2fs_evict_inode 2025-08-15 12:14:01 +02:00
iostat.c f2fs: add async reset zone command support 2023-06-12 13:04:09 -07:00
iostat.h f2fs: use iostat_lat_type directly as a parameter in the iostat_update_and_unbind_ctx() 2023-02-07 10:39:28 -08:00
Kconfig fs: add CONFIG_BUFFER_HEAD 2023-08-02 09:13:09 -06:00
Makefile f2fs: separate out iostat feature 2021-08-23 10:25:51 -07:00
namei.c f2fs: prevent kernel warning due to negative i_nlink from corrupted image 2025-06-27 11:11:21 +01:00
node.c Revert "f2fs: rebuild nat_bits during umount" 2025-04-20 10:15:20 +02:00
node.h f2fs: use BLKS_PER_SEG, BLKS_PER_SEC, and SEGS_PER_SEC 2024-02-27 09:41:12 -08:00
recovery.c move asm/unaligned.h to linux/unaligned.h 2024-10-02 17:23:23 -04:00
segment.c f2fs: zone: fix to calculate first_zoned_segno correctly 2025-07-10 16:04:59 +02:00
segment.h f2fs: fix to calculate dirty data during has_not_enough_free_secs() 2025-08-15 12:14:01 +02:00
shrinker.c f2fs: add block_age-based extent cache 2022-12-12 14:53:56 -08:00
super.c f2fs: fix bio memleak when committing super block 2025-08-15 12:14:00 +02:00
sysfs.c f2fs: fix to check upper boundary for gc_no_zoned_gc_percent 2025-08-15 12:14:01 +02:00
verity.c f2fs-6.12-rc1 2024-09-24 15:12:38 -07:00
xattr.c f2fs: reduce expensive checkpoint trigger frequency 2024-08-15 15:26:39 +00:00
xattr.h f2fs: move f2fs_xattr_handlers and f2fs_xattr_handler_map to .rodata 2023-10-09 16:24:18 +02:00