]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - queue-6.6/f2fs-truncate-page-cache-before-clearing-flags-when-.patch
Fixes for 6.6
[thirdparty/kernel/stable-queue.git] / queue-6.6 / f2fs-truncate-page-cache-before-clearing-flags-when-.patch
1 From 82c0091bc8c4dec778679538217db6137bb0b46d Mon Sep 17 00:00:00 2001
2 From: Sasha Levin <sashal@kernel.org>
3 Date: Wed, 13 Mar 2024 20:26:20 +0900
4 Subject: f2fs: truncate page cache before clearing flags when aborting atomic
5 write
6
7 From: Sunmin Jeong <s_min.jeong@samsung.com>
8
9 [ Upstream commit 74b0ebcbdde4c7fe23c979e4cfc2fdbf349c39a3 ]
10
11 In f2fs_do_write_data_page, FI_ATOMIC_FILE flag selects the target inode
12 between the original inode and COW inode. When aborting atomic write and
13 writeback occur simultaneously, invalid data can be written to original
14 inode if the FI_ATOMIC_FILE flag is cleared meanwhile.
15
16 To prevent the problem, let's truncate all pages before clearing the flag
17
18 Atomic write thread Writeback thread
19 f2fs_abort_atomic_write
20 clear_inode_flag(inode, FI_ATOMIC_FILE)
21 __writeback_single_inode
22 do_writepages
23 f2fs_do_write_data_page
24 - use dn of original inode
25 truncate_inode_pages_final
26
27 Fixes: 3db1de0e582c ("f2fs: change the current atomic write way")
28 Cc: stable@vger.kernel.org #v5.19+
29 Reviewed-by: Sungjong Seo <sj1557.seo@samsung.com>
30 Reviewed-by: Yeongjin Gil <youngjin.gil@samsung.com>
31 Signed-off-by: Sunmin Jeong <s_min.jeong@samsung.com>
32 Reviewed-by: Daeho Jeong <daehojeong@google.com>
33 Reviewed-by: Chao Yu <chao@kernel.org>
34 Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
35 Signed-off-by: Sasha Levin <sashal@kernel.org>
36 ---
37 fs/f2fs/segment.c | 4 +++-
38 1 file changed, 3 insertions(+), 1 deletion(-)
39
40 diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
41 index 0edd9feff6185..4549964819731 100644
42 --- a/fs/f2fs/segment.c
43 +++ b/fs/f2fs/segment.c
44 @@ -192,6 +192,9 @@ void f2fs_abort_atomic_write(struct inode *inode, bool clean)
45 if (!f2fs_is_atomic_file(inode))
46 return;
47
48 + if (clean)
49 + truncate_inode_pages_final(inode->i_mapping);
50 +
51 release_atomic_write_cnt(inode);
52 clear_inode_flag(inode, FI_ATOMIC_COMMITTED);
53 clear_inode_flag(inode, FI_ATOMIC_REPLACE);
54 @@ -201,7 +204,6 @@ void f2fs_abort_atomic_write(struct inode *inode, bool clean)
55 F2FS_I(inode)->atomic_write_task = NULL;
56
57 if (clean) {
58 - truncate_inode_pages_final(inode->i_mapping);
59 f2fs_i_size_write(inode, fi->original_i_size);
60 fi->original_i_size = 0;
61 }
62 --
63 2.43.0
64