主旨

一个新创建的文件也可能存在一个新创建的目录中。对它做fsync也可能导致对目录的fsync,进而导致CP。

总结:有很接近的地方,但是没有找到确凿证据

  1. 是不是创建文件的时候设置了lost_pino导致fsync的时候出发CP条件?

    只有具有FI_INC_LINK的inode才会设置lost_pino,新建文件的时候没有设置这个标记

  2. 是不是创建文件的时候IS_DIRSYNC(dir)为真而主动触发了CP?

    这个标记与文件系统的挂载选项有关。

对目录文件做fsync会导致CP

cp_reason = CP_NON_REGULAR;

文件丢失pino?

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更新。

猜测:创建文件的时候设置lost_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)))