summaryrefslogtreecommitdiffstats
path: root/fs/f2fs/node.c
diff options
context:
space:
mode:
authorChao Yu2018-07-04 12:04:10 +0200
committerJaegeuk Kim2018-07-29 03:26:08 +0200
commit4b270a8cc5047682f0a3f3f9af3b498408dbd2bc (patch)
tree134cb65533577abc680ad9e97383232678664c7a /fs/f2fs/node.c
parentf2fs: show the fsync_mode=nobarrier mount option (diff)
downloadkernel-qcow2-linux-4b270a8cc5047682f0a3f3f9af3b498408dbd2bc.tar.gz
kernel-qcow2-linux-4b270a8cc5047682f0a3f3f9af3b498408dbd2bc.tar.xz
kernel-qcow2-linux-4b270a8cc5047682f0a3f3f9af3b498408dbd2bc.zip
f2fs: try grabbing node page lock aggressively in sync scenario
In synchronous scenario, like in checkpoint(), we are going to flush dirty node pages to device synchronously, we can easily failed writebacking node page due to trylock_page() failure, especially in condition of intensive lock competition, which can cause long latency of checkpoint(). So let's use lock_page() in synchronous scenario to avoid this issue. Signed-off-by: Yunlei He <heyunlei@huawei.com> Signed-off-by: Chao Yu <yuchao0@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Diffstat (limited to 'fs/f2fs/node.c')
-rw-r--r--fs/f2fs/node.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
index 6f21319d08d3..82664733f770 100644
--- a/fs/f2fs/node.c
+++ b/fs/f2fs/node.c
@@ -1638,7 +1638,9 @@ next_step:
!is_cold_node(page)))
continue;
lock_node:
- if (!trylock_page(page))
+ if (wbc->sync_mode == WB_SYNC_ALL)
+ lock_page(page);
+ else if (!trylock_page(page))
continue;
if (unlikely(page->mapping != NODE_MAPPING(sbi))) {