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 */
};
在更新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恢复,则清除这个标志位。
猜测这个意思是即使块计数和文件大小有误,在恢复时仍可以通过盘上信息恢复出来,也就是没必要在fsync的时候因为这个写inode。
flowchart
A[f2fs_i_size_write]-->B[set_inode_flag]
B-->C[FI_AUTO_RECOVER]
D[f2fs_i_blocks_write]-->B
该文件是否有追加数据。追加写与覆盖写相对。
在f2fs中,文件一般就是追加写的,没有覆盖写。所以这就代表有没有写入新数据。
在不使用oob恢复的情况下,这个标志位代表应该在fsync时写inode/node页,因为写入新数据需要修改元数据。
在使用oob恢复的情况下,不用这个标志位判断是否需要刷写inode/node,因为文件的映射关系可以通过扫描oob来恢复。
该文件是否有就地更新(in-place update, IPU)数据。在ZNS盘上是不会有IPU的
该文件是否是原子写文件。
f2fs_is_atomic_file检查这个标志位。