]> git.ipfire.org Git - thirdparty/kernel/linux.git/commit
f2fs: fix potential deadlock in gc_merge path of f2fs_balance_fs()
authorChao Yu <chao@kernel.org>
Tue, 19 May 2026 01:14:38 +0000 (01:14 +0000)
committerJaegeuk Kim <jaegeuk@kernel.org>
Mon, 22 Jun 2026 19:52:34 +0000 (19:52 +0000)
commit8b4468ec023d0d1b4669dfb867588997cc03a06b
treeeaefa3b0419b49a7acaefd8465d58e09370a686e
parent47a60629caca7ea6475deb21d16112b35645b59f
f2fs: fix potential deadlock in gc_merge path of f2fs_balance_fs()

When we mount device w/ gc_merge mount option, we may suffer below
potential deadlock:

Kworker GC trehad Truncator
- f2fs_write_cache_pages
 - f2fs_write_single_data_page
  - f2fs_do_write_data_page
   - folio_start_writeback  --- set writeback flag on folio
   - f2fs_outplace_write_data
   : cached folio in internal bio cache
  - f2fs_balance_fs
   - wake_up(gc_thread)
   : wake up gc thread to run foreground GC
   - finish_wait(fggc_wq)
   : wait on the waitqueue --- wait on GC thread to finish the work
- truncate_inode_pages_range
 - __filemap_get_folio(, FGP_LOCK)  --- lock folio
 - truncate_inode_partial_folio
  - folio_wait_writeback            --- wait on writeback being cleared
- do_garbage_collect
 - move_data_page
  - f2fs_get_lock_data_folio
   - lock on folio  --- blocked on folio's lock

In order to avoid such deadlock, let's call below functions to commit
cached bios in GC_MERGE path of f2fs_balance_fs() as the same as we did
in NOGC_MERGE path.
- f2fs_submit_merged_write(sbi, DATA);
- f2fs_submit_all_merged_ipu_writes(sbi);

Cc: stable@kernel.org
Fixes: 351df4b20115 ("f2fs: add segment operations")
Cc: Ruipeng Qi <ruipengqi3@gmail.com>
Reported: Sandeep Dhavale <dhavale@google.com>
Signed-off-by: Chao Yu <chao@kernel.org>
Signed-off-by: Chao Yu <chaseyu@google.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/segment.c