F2FS源码分析-6.1 [其他重要数据结构以及函数] f2fs_summary的作用

F2FS源码分析系列文章
主目录
一、文件系统布局以及元数据结构
二、文件数据的存储以及读写
三、文件与目录的创建以及删除(未完成)
四、垃圾回收机制
五、数据恢复机制
六、重要数据结构或者函数的分析
  1. f2fs_summary的作用
  2. f2fs_journal的作用
  3. f2fs_map_block的作用
  4. get_dnode_of_data的作用
  5. get_node_page的作用(未完成)

f2fs_summary的作用

从第二章第一节F2FS文件组织结构可以知道,一个文件是如何通过node找到对应的data的物理地址。但是一些场合会反过来,需要通过data的物理地址找到保存这个地址的node的信息。例如GC的时候,F2FS会找到一个segment进行GC,将数据块迁移到新的segment中。此时系统要根据segment里面的block的物理地址,反过来找到node的信息,然后将新的数据块物理地址重新更新的node的对应位置,更具体可以参考垃圾回收章节

因此SSA的主要作用是提供系统通过数据块物理地址找到所属的node的信息的能力。我们可以直接分析f2fs_summary的源码:

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;

系统中每一个数据块的物理地址,都对应了一个f2fs_summary,系统可以通过物理地址找到对应的f2fs_summaryf2fs_summarynid变量表示当前的数据块所属的node的nid。而ofs_in_node则表示当前的数据块位于这个node的第几个block,即f2fs_inode->i_addr[ofs_in_node]或者direct_node->addr[ofs_in_node],可以参考F2FS文件组织结构这一节。

f2fs_summary保存在f2fs_summary_block中,而每一个f2fs_summary_block都保存了512个f2fs_summary,对应一个segment保存的数据块的数目,因此一个segment对应一个f2fs_summary_block,系统可以通过segment number(segno)找到对应的f2fs_summary_block,然后再找到对应的f2fs_summary

f2fs_summary_block的定义可以发现,除了f2fs_summary以外,还保存了f2fs_journal以及summary_footersummary_footertype变量表明当前的f2fs_summary_block是保存了node数据还是data数据。f2fs_journal用于缓存一些当前的对SIT和NAT的一些改动,避免频繁读写NAT和SIT区域的数据,可以参考f2fs_journal的作用这一节。

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

struct summary_footer {
	unsigned char entry_type;	/* SUM_TYPE_XXX */
	__le32 check_sum;		/* summary checksum */
} __packed;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
F2FS是专为闪存设备设计的文件系统,具有出色的性能和可靠性。下面对F2FS的代码进行简要的分析: 1. 超级块(superblock):超级块是F2FS中存储文件系统元数据的结构体,包含文件系统的基本信息,如版本号、块大小、节点大小、块位图、节点位图、inode表、日志区域等。 2. inode(index node):inode是F2FS中存储文件和目录元数据的结构体,每个文件和目录都会对应一个inode节点。inode包含文件类型、权限、大小、数据块指针等信息。 3. 数据块(data block):数据块是F2FS中存储文件数据的结构体,每个数据块大小为4KB,可以存储文件数据、索引节点数据、日志数据等。 4. 日志(journal):F2FS中的写操作都会先写入日志,然后再同步到数据块中。日志大小为1MB,用于记录文件系统的变化情况,以便在系统重启后恢复数据的一致性。 5. 垃圾回收(garbage collection):由于闪存设备的写入操作是有限制的,因此需要定期进行垃圾回收以释放已经不再使用的空间。F2FS中的垃圾回收机制采用了段式管理的思路,即将整个闪存设备分成多个段,每个段独立进行垃圾回收。 6. 压缩(compression):F2FS中的压缩机制采用了zlib压缩算法,可以将文件数据进行压缩以节省存储空间和提高读写性能。 7. 加密(encryption):F2FS中的加密机制采用了AES加密算法,可以对文件和数据进行加密和解密以保护用户数据的安全性。 总之,F2FS是一种高效、可靠的文件系统,它的代码实现非常精细和模块化,各个模块之间相互独立,并且有很好的扩展性和灵活性。F2FS的设计思路和数据结构也非常有特色,可以更好地充分利用闪存设备的性能和寿命。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值