• Chao Yu's avatar
    f2fs: fix panic during f2fs_resize_fs() · 3ab0598e
    Chao Yu authored
    f2fs_resize_fs() hangs in below callstack with testcase:
    - mkfs 16GB image & mount image
    - dd 8GB fileA
    - dd 8GB fileB
    - sync
    - rm fileA
    - sync
    - resize filesystem to 8GB
    
    kernel BUG at segment.c:2484!
    Call Trace:
     allocate_segment_by_default+0x92/0xf0 [f2fs]
     f2fs_allocate_data_block+0x44b/0x7e0 [f2fs]
     do_write_page+0x5a/0x110 [f2fs]
     f2fs_outplace_write_data+0x55/0x100 [f2fs]
     f2fs_do_write_data_page+0x392/0x850 [f2fs]
     move_data_page+0x233/0x320 [f2fs]
     do_garbage_collect+0x14d9/0x1660 [f2fs]
     free_segment_range+0x1f7/0x310 [f2fs]
     f2fs_resize_fs+0x118/0x330 [f2fs]
     __f2fs_ioctl+0x487/0x3680 [f2fs]
     __x64_sys_ioctl+0x8e/0xd0
     do_syscall_64+0x33/0x80
     entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    The root cause is we forgot to check that whether we have enough space
    in resized filesystem to store all valid blocks in before-resizing
    filesystem, then allocator will run out-of-space during block migration
    in free_segment_range().
    
    Fixes: b4b10061 ("f2fs: refactor resize_fs to avoid meta updates in progress")
    Signed-off-by: default avatarChao Yu <yuchao0@huawei.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    3ab0598e
gc.c 50.5 KB