许多文章会介绍F2FS,对于入门者来说能够了解个F2FS全貌,但是真正了解这个年轻的文件系统还是要看源码的。网上F2fs源码导读的文章,我到现在还是没看过,所以就用这几篇博客来介绍下f2fs,以期对f2fs有更加深入的认识,甚至对整个IO路径的认知有所启发。
下面
文件系统的包括文件系统在磁盘上的布局,也包括在驻留在内存中的文件系统的“驱动”
mount过程主要是新建段管理器(segment manager),节点管理器(node manager)。其中,段管理器是为了垃圾回收,因为垃圾回收算法中需要考察段中有效块(block)的数目,从而决定到底回收哪一个块;节点管理器则主要是为了解决文件系统老生常谈的一个问题:滚雪球。
创建新文件过程:
f2fs_create --> f2fs_new_inode --> alloc_nid
node的两种状态:NID_NEW 和 NID_ALLOC。
nat为什么可以阻止滚雪球效应?这是因为nat中存储的是一个node,这个node属于哪个inode?还有这个node的地址。突然对NAT的意义表示模糊。segment area的意义是明确的,就是main area中的每个段的信息,包括这个段有效的block个数以及有效段的bitmap。但是NAT段呢?NAT,Node Address Table。数组的下标是nids,数组的内容是这个nids是属于哪一个ino,即属于哪一个文件的,以及标号是nids的号的node在外存中的地址block_t。比如,我们生成了一个很大的文件,发现这个文件占用了很多的node,那么该文件所有的dnode的ino域都会是这个新生成文件的ino号【这样就遇到一个问题了,我们如何区分一个node到底是inode,还是一级dnode,还是二级dnode呢?如何表征一个inode?】