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

相关文章

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制