Skip to content

Commit 1005a3c

Browse files
chaseyuJaegeuk Kim
authored andcommitted
f2fs: fix to trigger foreground gc during f2fs_map_blocks() 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> 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: 36abef4 ("f2fs: introduce mode=lfs mount option") Cc: Daeho Jeong <[email protected]> Signed-off-by: Chao Yu <[email protected]> Signed-off-by: Jaegeuk Kim <[email protected]>
1 parent e194e14 commit 1005a3c

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

fs/f2fs/data.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1573,8 +1573,11 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map, int flag)
15731573
end = pgofs + maxblocks;
15741574

15751575
next_dnode:
1576-
if (map->m_may_create)
1576+
if (map->m_may_create) {
1577+
if (f2fs_lfs_mode(sbi))
1578+
f2fs_balance_fs(sbi, true);
15771579
f2fs_map_lock(sbi, flag);
1580+
}
15781581

15791582
/* When reading holes, we need its node page */
15801583
set_new_dnode(&dn, inode, NULL, NULL, 0);

0 commit comments

Comments
 (0)