free_info 功成身退,node_info顺利接班。

// 这里还是蛮复杂的一件事,如果不搞清除的话,这个历史性的接班工作我们就接不上

上面说到 alloc_nid 和 alloc_nid_done 之后,这个free_nid算是被完全清除了。我们知道free_info 和 node_info 结构体的桥梁就是nid了,那么我们看下这个nid干什么用了!搜alloc_nid,主要有两处:1)创建一个新的inode【函数f2fs_mkdir, f2fs_create】;2)创建文件的索引的时候:【函数 get_dnode_of_data】。

我们发现这两条线到最后都不约而同地调用了接口new_node_page

1)__f2fs_add_link --> init_inode_metadata -->  new_inode_page --> new_node_page --> grab_cache_page

2)get_dnode_of_data --> new_node_page -->grab_cache_page

到这里,我们知道page中这个nid的页就建立起来了,这个得到这个页alloc_nid的工作也算是完成了,那么node_info中blk_addr是怎么设置的呢?

我们自动想到了address_spacing中的写回的钩子:f2fs_write_node_page;

在f2fs_write_node_page函数中,nid的信息首先会通过get_node_info 函数得到, 但是由于node管理器中的nat_root树中并没有相关的nid的信息,所以此时就会在最后的cache_nat_entry中建立啦! 可见此时打配合的两个管理结构是:1)基数树,nat_root;2)链表,nat_entries。

  static struct nat_entry *grab_nat_entry(struct f2fs_nm_info *nm_i, nid_t nid)
{
struct nat_entry *new; new = f2fs_kmem_cache_alloc(nat_entry_slab, GFP_ATOMIC);
f2fs_radix_tree_insert(&nm_i->nat_root, nid, new);
memset(new, , sizeof(struct nat_entry));
nat_set_nid(new, nid);
nat_reset_flag(new);
list_add_tail(&new->list, &nm_i->nat_entries);
nm_i->nat_cnt++;
return new;
}

但是根据日志文件系统的原理,我此时此刻还是不能确定最后的这个nid的节点要落到何处。

但是函数f2fs_write_node_page,继续向下执行,就会有set_node_addr函数,将nat_root中的地址填充完整,于是node_info完整了。

好了,到这里我们明白了node_info 与 free_nid 这个历史性交接过程:一个nid如何从free_list 到 nat_entries中去了。

f2fs解析(八)node 管理器中的node_info的更多相关文章

  1. f2fs解析(七)node管理器中的 free_nid 结构体

    除了node_info之外, node管理器中还有还有个重要的数据结构: struct free_nid { struct list_head list; /* for free node id li ...

  2. f2fs源码解析(五) node管理结构梳理

    node是f2fs重要的管理结构, 它非常重要! 系统挂载完毕后, 会有一个f2fs_nm_info结构的node管理器来管理node的分配. f2fs_nm_info中最让人疑惑的是几颗基数树: s ...

  3. 如何在URL筛选管理器中过滤不需要的URL

    互联网可以说是一把名副其实的双刃剑.一方面其可以提高工作效率.给企业提供充分的资源;另一方面如果管理不严,也会带来很多的隐患.如员工在上班时间玩游戏.炒股等等.为此现在很多企业希望对员工的网络行为进行 ...

  4. 无法将从VSS中的解决方案添加到TFS的源代码管理器中

    VSS是一种非常有用的项目文件管理工具,百度百科的解释是:VSS 的全称为 Visual Source Safe .作为 Microsoft Visual Studio 的一名成员,它主要任务就是负责 ...

  5. 元数据管理器中存在错误。 实例化来自文件“\\?\C:\Program Files\Microsoft SQL Server\MSAS11.MSSQLSERVER\OLAP\Data\Tfs_Analysis.0.db\vDimTestCaseOverlay.874.dim.xml”的元数据对象时出错。

    一.发现问题 启动SQLSERVER的数据分析服务失败 查看系统日志错误如下: 双击错误后显示详细错误: 元数据管理器中存在错误. 实例化来自文件“\\?\C:\Program Files\Micro ...

  6. Visual studio2019配置OPENCV 时属性管理器中没有Microsoft.Cpp.x64.user的解决办法

    方法一:重新下载Visual studio2017,再次打开2019就会出现Microsoft.Cpp.x64.user,感觉有些麻烦,也占电脑空间,推荐方法二. 方法二:与方法一原理相同,下载201 ...

  7. SurvivalShooter学习笔记(八.敌人管理器)

    敌人管理器:管理敌人的随机出生点创建 在场景中建立几个空物体,作为敌人的出生点 public class EnemyManager : MonoBehaviour { public PlayerHea ...

  8. TFS 中如何将项目加入已有的源代码管理器中?

    Visual Studio 的某解决方案已经加入 Team Foundation Server,现在再将已经存在的项目加入到解决方案中,可是签入时,并没有把新加入的项目签入,怎么办呢? 在团队资源管理 ...

  9. f2fs解析(三)NAT中如何区分inode和其他dnode

    首先,我们要知道NAT中的每个表项都对应着MAIN AREA区域中NODE段的一个block,还要知道NODE block很特别,block末尾会有一个node footer结构: 243 struc ...

随机推荐

  1. Microsoft Dynamics CRM 2013 安装程序及SDK 下载地址

    Microsoft Dynamics CRM 2013 已经具有相关资料 2013 Setup (Microsoft Dynamics CRM Server 2013) 下载地址: http://ww ...

  2. 软件快速开发平台 JEPF

    JEPF新一代软件快速开发平台(Java Elephant Platform)是一款优秀的平台产品,它本着灵活.快捷开发.高性能.高协作性.高稳定性.高可用性.人性化的操作体验为设计宗旨历经2年研发成 ...

  3. 读书笔记2014第3本:Visual Studio程序员箴言

    Visual Studio 2010是我经常使用的程序开发工具,也知道VS中有大量的快捷键可以帮助提高效率,可惜就是不愿意记忆,最近在学vim的时候快速把<Visual Studio程序员箴言& ...

  4. JAVA基础学习day16--集合三-Map、HashMap,TreeMap与常用API

    一.Map简述 1.1.简述 public interface Map<K,V> 类型参数: K - 此映射所维护的键的类型 key V - 映射值的类型 value 该集合提供键--值的 ...

  5. .NET下的并行开发(案例代码)

    以下主要是通过一个报表处理程序来说明并行开发的方式.对于数据冲突和共享,可以通过对象数组解决.设计到并行的核心代码已用红色标出.在并行程序的处理上,需要把原来串行的子公司变成一个一个类的对象,让所有的 ...

  6. iOS UIWebView和网页的交互(OC中调执行JS)

    UIWebView和网页的交互(OC中调执行JS)- (void)viewDidLoad{[super viewDidLoad];// 1.webViewUIWebView *webView = [[ ...

  7. [android] 手机卫士设置向导页面

    设置向导页面,通过SharedPreferences来判断是否已经设置过了,跳转到不同的页面 自定义样式 在res/values/styles.xml中 添加节点<style name=””&g ...

  8. IOS-Swift、Objective-C、C++混合编程

    1.Objective-C调用C++代码 后缀为m文件的是Objective-C的执行文件,而后缀为mm文件的是Objective-C++文件. 直接在Objective-C中是无法调用C++代码的, ...

  9. windows 7 下,如何统计某文件夹下 视频总时长

    由于项目需要,我需要给系统加权限,这真是一个让人头疼的问题,如果要每个业务方法都加上权限判断逻辑,那真的不敢想象是多么大的工作量,日后有变动的话,我会不会发疯? 所以我必须利用之前学到的AOP编程,在 ...

  10. find locate

    locate执行前先 updatedb 然后locate vstore 就可以了 find 加 -name 比如 find -name vstore 按理说 locate要快点,毕竟是数据库嘛 一:l ...