| From bfe209cac50987c36114239e699dd94fae149f0e Mon Sep 17 00:00:00 2001 |
| From: Chao Yu <yuchao0@huawei.com> |
| Date: Fri, 14 Feb 2020 17:45:12 +0800 |
| Subject: [PATCH] f2fs: fix to wait all node page writeback |
| |
| commit dc5a941223edd803f476a153abd950cc3a83c3e1 upstream. |
| |
| There is a race condition that we may miss to wait for all node pages |
| writeback, fix it. |
| |
| - fsync() - shrink |
| - f2fs_do_sync_file |
| - __write_node_page |
| - set_page_writeback(page#0) |
| : remove DIRTY/TOWRITE flag |
| - f2fs_fsync_node_pages |
| : won't find page #0 as TOWRITE flag was removeD |
| - f2fs_wait_on_node_pages_writeback |
| : wont' wait page #0 writeback as it was not in fsync_node_list list. |
| - f2fs_add_fsync_node_entry |
| |
| Fixes: 50fa53eccf9f ("f2fs: fix to avoid broken of dnode block list") |
| Signed-off-by: Chao Yu <yuchao0@huawei.com> |
| Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c |
| index ad024b7b1d43..e1e035db99b3 100644 |
| --- a/fs/f2fs/node.c |
| +++ b/fs/f2fs/node.c |
| @@ -1565,15 +1565,16 @@ static int __write_node_page(struct page *page, bool atomic, bool *submitted, |
| if (atomic && !test_opt(sbi, NOBARRIER)) |
| fio.op_flags |= REQ_PREFLUSH | REQ_FUA; |
| |
| - set_page_writeback(page); |
| - ClearPageError(page); |
| - |
| + /* should add to global list before clearing PAGECACHE status */ |
| if (f2fs_in_warm_node_list(sbi, page)) { |
| seq = f2fs_add_fsync_node_entry(sbi, page); |
| if (seq_id) |
| *seq_id = seq; |
| } |
| |
| + set_page_writeback(page); |
| + ClearPageError(page); |
| + |
| fio.old_blkaddr = ni.blk_addr; |
| f2fs_do_write_node_page(nid, &fio); |
| set_node_addr(sbi, &ni, fio.new_blkaddr, is_fsync_dnode(page)); |
| -- |
| 2.7.4 |
| |