atomic_t dirty_pages;

flowchart TD
	A[inode_inc_dirty_pages]-->B[atomic_inc]
	C[inode_dec_dirty_pages]-->D[atomic_dec]
	E[get_dirty_pages]-->F[atomic_read]
	B-->G["&F2FS_I(inode)->dirty_pages"]
	D-->G
	F-->G
	H[.set_page_dirty]-->I[f2fs_set_data_page_dirty]
	I-->J[hmfs_update_dirty_page]
	J-->A
	
	

可以看出这个值的作用是记录该文件中脏数据页的数量。不是node。

struct list_head gdirty_list;

global dirty list,是一个链表的中间件,表示当前inode是否在文件系统全局脏inode链表中

flowchart
	A[hmfs_inode_dirtied]-->B[list_add_tail]
	C[hmfs_inode_synced]-->D[list_del_init]
	B-->E["&F2FS_I(inode)->gdirty_list"]
	D-->E

原子写相关

struct list_head inmem_ilist

该文件是否保存在内存中?

用于原子写。因为文件原子写的文件必须一次性落盘,所以在落盘之前只能在内存中。

inmem_pages

flowchart
	A[hmfs_register_inmem_page]-->B[list_add_tail]-->C[inmem_pages]
	D[f2fs_set_data_page_dirty]-->A

如果某个脏页属于原子写文件,则通过hmfs_register_inmem_page将其加入inmem_pages链表中。

fsync_atomic

last_atomic

oob_last_page