enum {
	FI_NEW_INODE,		/* indicate newly allocated inode */
	FI_DIRTY_INODE,		/* indicate inode is dirty or not */
	FI_AUTO_RECOVER,	/* indicate inode is recoverable */
	FI_DIRTY_DIR,		/* indicate directory has dirty pages */
	FI_INC_LINK,		/* need to increment i_nlink */
	FI_ACL_MODE,		/* indicate acl mode */
	FI_NO_ALLOC,		/* should not allocate any blocks */
	FI_FREE_NID,		/* free allocated nide */
	FI_NO_EXTENT,		/* not to use the extent cache */
	FI_INLINE_XATTR,	/* used for inline xattr */
	FI_INLINE_DATA,		/* used for inline data*/
	FI_INLINE_DENTRY,	/* used for inline dentry */
	FI_APPEND_WRITE,	/* inode has appended data */
	FI_UPDATE_WRITE,	/* inode has in-place-update data */
	FI_NEED_IPU,		/* used for ipu per file */
	FI_ATOMIC_FILE,		/* indicate atomic file */
	FI_ATOMIC_COMMIT,	/* indicate the state of atomical committing */
	FI_VOLATILE_FILE,	/* indicate volatile file */
	FI_FIRST_BLOCK_WRITTEN,	/* indicate #0 data block was written */
	FI_DROP_CACHE,		/* drop dirty page cache */
	FI_DATA_EXIST,		/* indicate data exists */
	FI_INLINE_DOTS,		/* indicate inline dot dentries */
	FI_DO_DEFRAG,		/* indicate defragment is running */
	FI_DIRTY_FILE,		/* indicate regular/symlink has dirty pages */
	FI_NO_PREALLOC,		/* indicate skipped preallocated blocks */
	FI_HOT_DATA,		/* indicate file is hot */
	FI_EXTRA_ATTR,		/* indicate file has extra attribute */
	FI_PROJ_INHERIT,	/* indicate file inherits projectid */
	FI_PIN_FILE,		/* indicate file should not be gced */
	FI_ATOMIC_REVOKE_REQUEST,	/* request to drop atomic data */
	FI_LOG_FILE,		/* indicate file is a log */
	FI_HOT_FILE,		/* indicate file is hot */
	FI_ONLY_LARGEST_EXT_CHG,	/* indicate inode changed largest extent only */
};

FI_DIRTY_INODE

FI_ONLY_LARGEST_EXT_CHG

在更新extent cache的时候,如果没有文件数据的改变而只涉及到extent的修改,则将inode置脏并打上FI_ONLY_LARGEST_EXT_CHG标记,表示fsync的时候只刷写inode。

flowchart
	A[f2fs_update_extent_tree_range]-->hmfs_mark_inode_dirty_sync
	A-->C["set_inode_flag(inode, FI_ONLY_LARGEST_EXT_CHG);"]

但是在hmfs_inode_dirtied中,只要开启了oob恢复,则清除这个标志位。

FI_AUTO_RECOVER

猜测这个意思是即使块计数和文件大小有误,在恢复时仍可以通过盘上信息恢复出来,也就是没必要在fsync的时候因为这个写inode。

flowchart
	A[f2fs_i_size_write]-->B[set_inode_flag]
	B-->C[FI_AUTO_RECOVER]
	D[f2fs_i_blocks_write]-->B

FI_APPEND_WRITE

该文件是否有追加数据。追加写与覆盖写相对。

在f2fs中,文件一般就是追加写的,没有覆盖写。所以这就代表有没有写入新数据。

在不使用oob恢复的情况下,这个标志位代表应该在fsync时写inode/node页,因为写入新数据需要修改元数据。

在使用oob恢复的情况下,不用这个标志位判断是否需要刷写inode/node,因为文件的映射关系可以通过扫描oob来恢复。

FI_UPDATE_WRITE

该文件是否有就地更新(in-place update, IPU)数据。在ZNS盘上是不会有IPU的

FI_ATOMIC_FILE

该文件是否是原子写文件。

f2fs_is_atomic_file检查这个标志位。