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

2024-06-14 10:08

本文主要是介绍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=512struct f2fs_journal journal;struct summary_footer footer;
} __packed;struct summary_footer {unsigned char entry_type;	/* SUM_TYPE_XXX */__le32 check_sum;		/* summary checksum */
} __packed;

这篇关于F2FS源码分析-6.1 [其他重要数据结构以及函数] f2fs_summary的作用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1060103

相关文章

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

SpringBoot 中 CommandLineRunner的作用示例详解

《SpringBoot中CommandLineRunner的作用示例详解》SpringBoot提供的一种简单的实现方案就是添加一个model并实现CommandLineRunner接口,实现功能的... 目录1、CommandLineRunnerSpringBoot中CommandLineRunner的作用

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

java -jar命令运行 jar包时运行外部依赖jar包的场景分析

《java-jar命令运行jar包时运行外部依赖jar包的场景分析》:本文主要介绍java-jar命令运行jar包时运行外部依赖jar包的场景分析,本文给大家介绍的非常详细,对大家的学习或工作... 目录Java -jar命令运行 jar包时如何运行外部依赖jar包场景:解决:方法一、启动参数添加: -Xb

java中BigDecimal里面的subtract函数介绍及实现方法

《java中BigDecimal里面的subtract函数介绍及实现方法》在Java中实现减法操作需要根据数据类型选择不同方法,主要分为数值型减法和字符串减法两种场景,本文给大家介绍java中BigD... 目录Java中BigDecimal里面的subtract函数的意思?一、数值型减法(高精度计算)1.