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

相关文章

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

python dict转换成json格式的实现

《pythondict转换成json格式的实现》本文主要介绍了pythondict转换成json格式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下... 一开始你变成字典格式data = [ { 'a' : 1, 'b' : 2, 'c编程' : 3,

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.

Java实现数据库图片上传与存储功能

《Java实现数据库图片上传与存储功能》在现代的Web开发中,上传图片并将其存储在数据库中是常见的需求之一,本文将介绍如何通过Java实现图片上传,存储到数据库的完整过程,希望对大家有所帮助... 目录1. 项目结构2. 数据库表设计3. 实现图片上传功能3.1 文件上传控制器3.2 图片上传服务4. 实现

C语言中的浮点数存储详解

《C语言中的浮点数存储详解》:本文主要介绍C语言中的浮点数存储详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、首先明确一个概念2、接下来,讲解C语言中浮点型数存储的规则2.1、可以将上述公式分为两部分来看2.2、问:十进制小数0.5该如何存储?2.3 浮点

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

Java中使用注解校验手机号格式的详细指南

《Java中使用注解校验手机号格式的详细指南》在现代的Web应用开发中,数据校验是一个非常重要的环节,本文将详细介绍如何在Java中使用注解对手机号格式进行校验,感兴趣的小伙伴可以了解下... 目录1. 引言2. 数据校验的重要性3. Java中的数据校验框架4. 使用注解校验手机号格式4.1 @NotBl

MySQL常见的存储引擎和区别说明

《MySQL常见的存储引擎和区别说明》MySQL支持多种存储引擎,如InnoDB、MyISAM、MEMORY、Archive、CSV和Blackhole,每种引擎有其特点和适用场景,选择存储引擎时需根... 目录mysql常见的存储引擎和区别说明1. InnoDB2. MyISAM3. MEMORY4. A