同ext4 一样, f2fs 把不需要sync的写通过page cache的接口落盘。为此,有必要了解f2fs中 page cache相关的接口。

以读为例:

do_read_inode依据inode节点号,将inode所在的磁盘block读到页缓存,该block恰好对应着页缓存中的一个page,对page进行F2FS_INODE转换,转换成f2fs_inode结构。最后使用f2fs_inode 对inode初始化。
我们接着深入get_node_page函数,看看f2fs是如何读取磁盘block的。

__get_node_page函数。
该函数首先调用grab_cache_page查找address_space中是否有inode索引节点号对应的page,如果没有则创建一个新的page插入到页缓存中。紧接着调用read_node_page从磁盘中读取inode对应的block,将block数据放到刚刚创建的page中,最后返回读取到的page。

进入read_node_page。
该函数首先构造bio所需的信息,将信息填充在f2fs_io_info中,并调用get_node_info获得node信息,放到node_info中。最后调用f2fs_submit_page_bio提交bio请求,从磁盘中读取block到page中。

f2fs有三种inode,meta_inode,node_inode和普通的文件inode,前两种inode只存在于vfs层,且数量只有一个。meta_inode对应于SIT,NAT,SSA,checkpoint和super block这些文件系统元数据,node inode对应于main area的node segment的数据,普通文件inode读写的区域对应于main area的data segment。所以,所有的f2fs数据的读写都是通过vfs层的inode的。这些inode的保存在f2fs_sb_info中,在文件系统初始化时f2fs_fill_super生成。再看inode的初始化过程,在函数inode.c/f2fs_iget中: