]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
f2fs: fix to tag gcing flag on page during block migration
authorChao Yu <chao@kernel.org>
Sun, 10 Dec 2023 11:35:42 +0000 (19:35 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 23 Feb 2024 07:54:48 +0000 (08:54 +0100)
[ Upstream commit 4961acdd65c956e97c1a000c82d91a8c1cdbe44b ]

It needs to add missing gcing flag on page during block migration,
in order to garantee migrated data be persisted during checkpoint,
otherwise out-of-order persistency between data and node may cause
data corruption after SPOR.

Similar issue was fixed by commit 2d1fe8a86bf5 ("f2fs: fix to tag
gcing flag on page during file defragment").

Signed-off-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/f2fs/compress.c
fs/f2fs/file.c

index 3982b4a7618ce72f3a515b027a035fe65c9b6247..7b4479d5b5315f9b86faaa7eab7f9bf07f4658aa 100644 (file)
@@ -1037,8 +1037,10 @@ static void set_cluster_dirty(struct compress_ctx *cc)
        int i;
 
        for (i = 0; i < cc->cluster_size; i++)
-               if (cc->rpages[i])
+               if (cc->rpages[i]) {
                        set_page_dirty(cc->rpages[i]);
+                       set_page_private_gcing(cc->rpages[i]);
+               }
 }
 
 static int prepare_compress_overwrite(struct compress_ctx *cc,
index d220c4523982111dde1cde7774b084be74eee193..489854d841e754c568a8b63c1322ce433ccecdab 100644 (file)
@@ -1278,6 +1278,7 @@ static int __clone_blkaddrs(struct inode *src_inode, struct inode *dst_inode,
                        }
                        f2fs_copy_page(psrc, pdst);
                        set_page_dirty(pdst);
+                       set_page_private_gcing(pdst);
                        f2fs_put_page(pdst, 1);
                        f2fs_put_page(psrc, 1);
 
@@ -3981,6 +3982,7 @@ static int redirty_blocks(struct inode *inode, pgoff_t page_idx, int len)
                        break;
                }
                set_page_dirty(page);
+               set_page_private_gcing(page);
                f2fs_put_page(page, 1);
                f2fs_put_page(page, 0);
        }