[F2FS 元数据布局部分] Segment Summary Area-SSA结构

1 篇文章 0 订阅

Segment Summary Area区域-SSA结构
Segment Summary Area,简称SSA,是F2FS用于集中管理物理地址到逻辑地址的映射关系的结构,同时它也具有通过journal缓存sit或者nat的操作用于数据恢复的作用。映射关系的主要作用是当给出一个物理地址的时候,可以通过SSA索引得到对应的逻辑地址,主要应用在GC流程中; SSA所包含的journal可以缓存一些sit或者nat的操作,用于避免频繁的元数据更新,以及宕机时候的数据恢复。

SSA在元数据区域的物理结构
在这里插入图片描述
从结构图可以知道,SSA区域由N个struct f2fs_summary_block组成,每一个struct f2fs_summary_block包含了512个struct f2fs_summary_entry,刚好对应一个segment。segment里面的每一个block(物理地址)对应一个的struct f2fs_summary_entry,它记录了物理地址到逻辑地址的映射信息。它包含了三个变量: nid(该物理地址是属于哪一个node的),version(用于数据恢复),ofs_in_node(该物理地址属于该nid对应的node的第ofs_in_node个block,偏移量)。

f2fs_journal属于journal的信息,它的作用是减少频繁地对NAT区域以及SIT区域的更新。例如,当系统写压力很大的时候,segment bitmap更新就会很频繁,就会对到SIT章节所提到的struct f2fs_sit_entry结构进行频繁地改动。如果这个时候频繁将新的映射关系写入SIT,就会加重写压力。此时可以将数据先写入到journal中,因此journal的作用就是维护这些经常修改的数据,等待CP被触发的时候才写入磁盘,从而减少写压力。也许这里会有疑问,为什么将journal放在SSA区域而不是NAT区域以及SIT区域呢?这是因为这种存放方式可以减少元数据区域空间的占用。关于journal的描述以及作用可以参考Checkpoint章节。
SSA物理存放区域结构
从上图所示,SSA的基本存放单元是struct f2fs_summary_block,它结构如下:

struct f2fs_summary_block {
	struct f2fs_summary entries[ENTRIES_IN_SUM]; // ENTRIES_IN_SUM = 512
	struct f2fs_journal journal;
	struct summary_footer footer;
} __packed;

与summary直接相关的是struct f2fs_summary以及struct summary_footer。ENTRIES_IN_SUM的值512,因此每一个entry对应一个block,记录了从物理地址到逻辑地址的映射关系,entry的结构如下:

struct f2fs_summary {
	__le32 nid;		/* parent node id */
	union {
		__u8 reserved[3];
		struct {
			__u8 version;		/* node version number */
			__le16 ofs_in_node;	/* block index in parent node */
		} __packed;
	};
} __packed;

用了一个union结构进行表示,但是核心信息是nid、version以及ofs_in_node。根据第二章的第一节文件数据的保存以及物理地址的映射可以知道,数据的索引是通过node来进行。文件访问某一个页的数据时,需要首先根据页的索引,找到对应的nid以及offset(两者构成逻辑地址),从而根据nid得到node page,再根据offset得到了该页的物理地址,然后从磁盘中读取出来。f2fs_summary则是记录物理地址到逻辑地址的映射,即根据物理地址找到对应的nid以及offset。例如,现在需要根据物理地址为624的block,找到对应的nid以及offset。那么物理地址为624,可以得到该地址位于第二个segment,然后属于第二个segment的第113个block(block的编址从0开始)。因此根据属于第二个segment的信息,找到第二个struct f2fs_summary_block,然后根据偏移量为113的信息,找到对应的struct f2fs_summary结构,从而得到nid以及ofs_in_node。

所以,f2fs_summary_block是从nid/offset->物理地址的逆过程,从逻辑到物理是根据逻辑是多少页,然后根据文件路径找到对应的nid和offset,然后找到对应的inode或direct_node或indirect_node(根据nid),然后利用偏移direct->addr[offset]得到物理地址(物理地址是以block为计量的,每一个偏移是4kb),物理地址存在这个node里面,f2fs_summary_block是知道了第多少个block,现在想知道nid和偏移,这个过程要通过f2fs_summary,每个segment有512个block,判断物理地址的block(上面例子为624)在第几个segment中,因为一个struct f2fs_summary_block有512个entries,和每个segment中block的量刚好对应,所以在第几个segment中就在第几个f2fs_summary_block中,然后根据偏移(624-512+1)+1是因为512是个数,624是index,从0开始的,找到entries[113],得到其对应的nid和ofs_in_node。

struct summary_footer结构记录了校验信息,以及这个summary对应的segment是属于保存data数据的segment还是node数据的segment。

SSA内存管理结构
SSA在内存没有单独的管理结构,summary以及journal在内存中主要存在于CURSEG中,可以从Checkpoint结构这一章节找到相关的描述。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值