Re: [LTP] [f2fs] 02eb84b96b:

From: Weichao Guo
Date: Thu Apr 29 2021 - 09:09:19 EST

On 2021/3/23 17:04, Chao Yu wrote:
On 2021/3/11 4:49, Jaegeuk Kim wrote:
On 03/10, Huang Jianan wrote:
Hi Richard,

On 2021/3/9 12:01, Matthew Wilcox wrote:
On Tue, Mar 09, 2021 at 10:23:35AM +0800, Weichao Guo wrote:
Hi Richard,

On 2021/3/8 19:53, Richard Palethorpe wrote:

kern  :err   : [  187.461914] F2FS-fs (sda1): Swapfile does not align to section
commit 02eb84b96bc1b382dd138bf60724edbefe77b025
Author: huangjianan@xxxxxxxx <huangjianan@xxxxxxxx>
Date:   Mon Mar 1 12:58:44 2021 +0800
       f2fs: check if swapfile is section-alligned
       If the swapfile isn't created by pin and fallocate, it can't be
       guaranteed section-aligned, so it may be selected by f2fs gc. When
       gc_pin_file_threshold is reached, the address of swapfile may change,
       but won't be synchronized to swap_extent, so swap will write to wrong
       address, which will cause data corruption.
       Signed-off-by: Huang Jianan <huangjianan@xxxxxxxx>
       Signed-off-by: Guo Weichao <guoweichao@xxxxxxxx>
       Reviewed-by: Chao Yu <yuchao0@xxxxxxxxxx>
       Signed-off-by: Jaegeuk Kim <jaegeuk@xxxxxxxxxx>
The test uses fallocate to preallocate the swap file and writes zeros to
it. I'm not sure what pin refers to?
'pin' refers to pinned file feature in F2FS, the LBA(Logical Block Address)
of a file is fixed after pinned. Without this operation before fallocate,
the LBA may not align with section(F2FS GC unit), some LBA of the file may
be changed by F2FS GC in some extreme cases.

For this test case, how about pin the swap file before fallocate for F2FS as

ioctl(fd, F2FS_IOC_SET_PIN_FILE, true);
No special ioctl should be needed.  f2fs_swap_activate() should pin the
file, just like it converts inline inodes and disables compression.

Now f2fs_swap_activate() will pin the file. The problem is that when

is executed, the file has been created and may not be section-aligned.

So I think it would be better to consider aligning the swapfile during

Does it make sense to reallocate blocks like
in f2fs_swap_activate(),
    set_inode_flag(inode, FI_PIN_FILE);
    truncate_pagecache(inode, 0);
    f2fs_truncate_blocks(inode, 0, true);

It will corrupt swap header info while relocating whole swapfile...
How about back up the header page, and recover it after expand_inode_data() ?