From: Greg Kroah-Hartman Date: Sun, 17 Mar 2019 15:44:59 +0000 (+0100) Subject: 4.20-stable patches X-Git-Tag: v5.0.3~10 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=50d5425e55b495d29f48f1aff8e9153d588b561b;p=thirdparty%2Fkernel%2Fstable-queue.git 4.20-stable patches added patches: f2fs-wait-on-atomic-writes-to-count-f2fs_cp_wb_data.patch --- diff --git a/queue-4.20/f2fs-wait-on-atomic-writes-to-count-f2fs_cp_wb_data.patch b/queue-4.20/f2fs-wait-on-atomic-writes-to-count-f2fs_cp_wb_data.patch new file mode 100644 index 00000000000..4f8d3be02d6 --- /dev/null +++ b/queue-4.20/f2fs-wait-on-atomic-writes-to-count-f2fs_cp_wb_data.patch @@ -0,0 +1,63 @@ +From 31867b23d7d1ee3535136c6a410a6cf56f666bfc Mon Sep 17 00:00:00 2001 +From: Jaegeuk Kim +Date: Fri, 28 Dec 2018 11:00:38 -0800 +Subject: f2fs: wait on atomic writes to count F2FS_CP_WB_DATA + +From: Jaegeuk Kim + +commit 31867b23d7d1ee3535136c6a410a6cf56f666bfc upstream. + +Otherwise, we can get wrong counts incurring checkpoint hang. + +IO_W (CP: -24, Data: 24, Flush: ( 0 0 1), Discard: ( 0 0)) + +Thread A Thread B +- f2fs_write_data_pages + - __write_data_page + - f2fs_submit_page_write + - inc_page_count(F2FS_WB_DATA) + type is F2FS_WB_DATA due to file is non-atomic one +- f2fs_ioc_start_atomic_write + - set_inode_flag(FI_ATOMIC_FILE) + - f2fs_write_end_io + - dec_page_count(F2FS_WB_CP_DATA) + type is F2FS_WB_DATA due to file becomes + atomic one + +Cc: +Reviewed-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Greg Kroah-Hartman + +--- + fs/f2fs/file.c | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +--- a/fs/f2fs/file.c ++++ b/fs/f2fs/file.c +@@ -1749,10 +1749,12 @@ static int f2fs_ioc_start_atomic_write(s + + down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); + +- if (!get_dirty_pages(inode)) +- goto skip_flush; +- +- f2fs_msg(F2FS_I_SB(inode)->sb, KERN_WARNING, ++ /* ++ * Should wait end_io to count F2FS_WB_CP_DATA correctly by ++ * f2fs_is_atomic_file. ++ */ ++ if (get_dirty_pages(inode)) ++ f2fs_msg(F2FS_I_SB(inode)->sb, KERN_WARNING, + "Unexpected flush for atomic writes: ino=%lu, npages=%u", + inode->i_ino, get_dirty_pages(inode)); + ret = filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_MAX); +@@ -1760,7 +1762,7 @@ static int f2fs_ioc_start_atomic_write(s + up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); + goto out; + } +-skip_flush: ++ + set_inode_flag(inode, FI_ATOMIC_FILE); + clear_inode_flag(inode, FI_ATOMIC_REVOKE_REQUEST); + up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); diff --git a/queue-4.20/series b/queue-4.20/series index 0da7530580c..fa13e8a740f 100644 --- a/queue-4.20/series +++ b/queue-4.20/series @@ -36,3 +36,4 @@ ipv6-route-enforce-rcu-protection-in-ip6_route_check_nh_onlink.patch bonding-fix-packet_origdev-regression.patch net-smc-fix-smc_poll-in-smc_init-state.patch missing-barriers-in-some-of-unix_sock-addr-and-path-accesses.patch +f2fs-wait-on-atomic-writes-to-count-f2fs_cp_wb_data.patch