f2fs nat/sit area存储格式及current_nat_addr

2024-04-06 00:32

本文主要是介绍f2fs nat/sit area存储格式及current_nat_addr,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

f2fs为了保护元数据的有效性及可恢复性,每个无数据区域均包含两个复本,如两个super block, 两个check point segments, 对于nat及sit area,同样也包含两份。

对于nat area的存储方式,一直以来,都以为是先存一份,再存储另一份,类似于这种结构:

所以,对于current_nat_addr函数,一直无法理解代码实现的原理是什么。

今天偶然看了一篇博文,“f2fs系列文章——sit/nat_version_bitmap”,https://blog.csdn.net/WaterWin/article/details/79901440,里面描述了nat及sit area的存储格式,才对nat area的存储格式,及current_nat_addr函数有了一个真正的理解。

实际上,nat area存储方式是按照上图样式的,即每个segment与它的复本并列排列,后成紧跟它的复本,有了这个意识后,就可以比较容易的理解current_nat_addr函数了。


static inline pgoff_t current_nat_addr(struct f2fs_sb_info *sbi, nid_t start)
{struct f2fs_nm_info *nm_i = NM_I(sbi);pgoff_t block_off;pgoff_t block_addr;/** block_off = segment_off * 512 + off_in_segment* OLD = (segment_off * 512) * 2 + off_in_segment* NEW = 2 * (segment_off * 512 + off_in_segment) - off_in_segment*/block_off = NAT_BLOCK_OFFSET(start);block_addr = (pgoff_t)(nm_i->nat_blkaddr +(block_off << 1) -(block_off & (sbi->blocks_per_seg - 1)));if (f2fs_test_bit(block_off, nm_i->nat_bitmap))block_addr += sbi->blocks_per_seg;return block_addr;
}

大致的思路就是,先得到segment_off, segment_off*512得到block_off, block_off*2, 这个block_off*2得到的就是包含复本在内的,实际上是2倍的block_off,最后再加上1个off_in_segment,得到最终的nat block addr。 后面会举一个具体的例子说明。

再看一下sit area的磁盘布局格式:

SIT area 与NAT area磁盘格式不同,它的两个区域是并列存储的,了解了这个布局方式后,就能够对sit area的地址操作有很好的理解。

这篇关于f2fs nat/sit area存储格式及current_nat_addr的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C#中DateTime的格式符的实现示例

《C#中DateTime的格式符的实现示例》本文介绍了C#中DateTime格式符的使用方法,分为预定义格式和自定义格式两类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录DateTime的格式符1.核心概念2.预定义格式(快捷方案,直接复用)3.自定义格式(灵活可控

使用C#导出Excel数据并保存多种格式的完整示例

《使用C#导出Excel数据并保存多种格式的完整示例》在现代企业信息化管理中,Excel已经成为最常用的数据存储和分析工具,从员工信息表、销售数据报表到财务分析表,几乎所有部门都离不开Excel,本文... 目录引言1. 安装 Spire.XLS2. 创建工作簿和填充数据3. 保存为不同格式4. 效果展示5

MySQL中存储过程(procedure)的使用及说明

《MySQL中存储过程(procedure)的使用及说明》存储过程是预先定义的SQL语句集合,可在数据库中重复调用,它们提供事务性、高效性和安全性,MySQL和Java中均可创建和调用存储过程,示例展... 目录概念示例1示例2总结概念存储过程:在数据库中预先定义好一组SQL语句,可以被程序反复调用。

MySQL存储过程实践(in、out、inout)

《MySQL存储过程实践(in、out、inout)》文章介绍了数据库中的存储过程,包括其定义、优缺点、性能调校与撰写,以及创建和调用方法,还详细说明了存储过程的参数类型,包括IN、OUT和INOUT... 目录简述存储过程存储过程的优缺点优点缺点存储过程的创建和调用mysql 存储过程中的关键语法案例存储

使用python生成固定格式序号的方法详解

《使用python生成固定格式序号的方法详解》这篇文章主要为大家详细介绍了如何使用python生成固定格式序号,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录生成结果验证完整生成代码扩展说明1. 保存到文本文件2. 转换为jsON格式3. 处理特殊序号格式(如带圈数字)4

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

k8s搭建nfs共享存储实践

《k8s搭建nfs共享存储实践》本文介绍NFS服务端搭建与客户端配置,涵盖安装工具、目录设置及服务启动,随后讲解K8S中NFS动态存储部署,包括创建命名空间、ServiceAccount、RBAC权限... 目录1. NFS搭建1.1 部署NFS服务端1.1.1 下载nfs-utils和rpcbind1.1

Redis高性能Key-Value存储与缓存利器常见解决方案

《Redis高性能Key-Value存储与缓存利器常见解决方案》Redis是高性能内存Key-Value存储系统,支持丰富数据类型与持久化方案(RDB/AOF),本文给大家介绍Redis高性能Key-... 目录Redis:高性能Key-Value存储与缓存利器什么是Redis?为什么选择Redis?Red

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结