Message ID | 20230320172218.59628-1-frank.li@vivo.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 08a8457cfd7833daa8028acf4ab7baa62a13c652 |
Headers | show |
Series | [f2fs-dev,v2] f2fs: compress: fix to call f2fs_wait_on_page_writeback() in f2fs_write_raw_pages() | expand |
On 2023/3/21 1:22, Yangtao Li wrote: > BUG_ON() will be triggered when writing files concurrently, > because the same page is writtenback multiple times. > > 1597 void folio_end_writeback(struct folio *folio) > 1598 { > ...... > 1618 if (!__folio_end_writeback(folio)) > 1619 BUG(); > ...... > 1625 } > > kernel BUG at mm/filemap.c:1619! > Call Trace: > <TASK> > f2fs_write_end_io+0x1a0/0x370 > blk_update_request+0x6c/0x410 > blk_mq_end_request+0x15/0x130 > blk_complete_reqs+0x3c/0x50 > __do_softirq+0xb8/0x29b > ? sort_range+0x20/0x20 > run_ksoftirqd+0x19/0x20 > smpboot_thread_fn+0x10b/0x1d0 > kthread+0xde/0x110 > ? kthread_complete_and_exit+0x20/0x20 > ret_from_fork+0x22/0x30 > </TASK> > > Below is the concurrency scenario: > > [Process A] [Process B] [Process C] > f2fs_write_raw_pages() > - redirty_page_for_writepage() > - unlock page() > f2fs_do_write_data_page() > - lock_page() > - clear_page_dirty_for_io() > - set_page_writeback() [1st writeback] > ..... > - unlock page() > > generic_perform_write() > - f2fs_write_begin() > - wait_for_stable_page() > > - f2fs_write_end() > - set_page_dirty() > > - lock_page() > - f2fs_do_write_data_page() > - set_page_writeback() [2st writeback] > > This problem was introduced by the previous commit 7377e853967b ("f2fs: > compress: fix potential deadlock of compress file"). All pagelocks were > released in f2fs_write_raw_pages(), but whether the page was > in the writeback state was ignored in the subsequent writing process. > Let's fix it by waiting for the page to writeback before writing. > > Cc: Christoph Hellwig <hch@lst.de> > Fixes: 4c8ff7095bef ("f2fs: support data compression") > Fixes: 7377e853967b ("f2fs: compress: fix potential deadlock of compress file") > Signed-off-by: Qi Han <hanqi@vivo.com> > Signed-off-by: Yangtao Li <frank.li@vivo.com> Reviewed-by: Chao Yu <chao@kernel.org> Thanks,
Hello: This patch was applied to jaegeuk/f2fs.git (dev) by Jaegeuk Kim <jaegeuk@kernel.org>: On Tue, 21 Mar 2023 01:22:18 +0800 you wrote: > BUG_ON() will be triggered when writing files concurrently, > because the same page is writtenback multiple times. > > 1597 void folio_end_writeback(struct folio *folio) > 1598 { > ...... > 1618 if (!__folio_end_writeback(folio)) > 1619 BUG(); > ...... > 1625 } > > [...] Here is the summary with links: - [f2fs-dev,v2] f2fs: compress: fix to call f2fs_wait_on_page_writeback() in f2fs_write_raw_pages() https://git.kernel.org/jaegeuk/f2fs/c/08a8457cfd78 You are awesome, thank you!
diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c index 93fec1d37899..9b7149534a58 100644 --- a/fs/f2fs/compress.c +++ b/fs/f2fs/compress.c @@ -1456,6 +1456,12 @@ static int f2fs_write_raw_pages(struct compress_ctx *cc, if (!PageDirty(cc->rpages[i])) goto continue_unlock; + if (PageWriteback(cc->rpages[i])) { + if (wbc->sync_mode == WB_SYNC_NONE) + goto continue_unlock; + f2fs_wait_on_page_writeback(cc->rpages[i], DATA, true, true); + } + if (!clear_page_dirty_for_io(cc->rpages[i])) goto continue_unlock;