一个新创建的文件也可能存在一个新创建的目录中。对它做fsync也可能导致对目录的fsync,进而导致CP。
总结:有很接近的地方,但是没有找到确凿证据
是不是创建文件的时候设置了lost_pino导致fsync的时候出发CP条件?
只有具有FI_INC_LINK的inode才会设置lost_pino,新建文件的时候没有设置这个标记
是不是创建文件的时候IS_DIRSYNC(dir)为真而主动触发了CP?
这个标记与文件系统的挂载选项有关。
cp_reason = CP_NON_REGULAR;
flowchart
A[hmfs_init_inode_metadata]-->B[file_lost_pino]
C[f2fs_rename]-->B
D[f2fs_cross_rename]-->B
文件在增加硬链接计数、移动或目录更名等情况下,会改变其pino,因此在这里设置成lost状态。并在fsync时先CP,再用try_to_fix_pino更新。
文件在刚创建的时候会调用hmfs_init_inode_metadata初始化(见https://github.com/RiweiPan/F2FS-NOTES/blob/master/File-Creation-and-Deletion/文件创建.md)。这个过程中会调用file_lost_pino,因此在fsync的时候会因为CP_WRONG_PINO做CP。
但是只有具有FI_INC_LINK的inode才会设置lost_pino,新建文件的时候没有设置这个标记,但是重命名的时候设置了。
f2fs_create是用于创建新文件的函数,其中
if (IS_DIRSYNC(dir))
hmfs_sync_fs(sbi->sb, 1);
#define IS_DIRSYNC(inode) (__IS_FLG(inode, SB_SYNCHRONOUS|SB_DIRSYNC) || \\
((inode)->i_flags & (S_SYNC|S_DIRSYNC)))
SB_SYNCHRONOUS
或 SB_DIRSYNC
标志(通过 __IS_FLG(inode, SB_SYNCHRONOUS|SB_DIRSYNC)
)。