f2fs解析(十)nid 如何从nat_root中删除
上面我们谈到了一个nid如何从free_nid中转移到node_info中去【分别有一个链表和一棵基数树搭伙做事】,讲free_nid时,详细说明了free_nid中是如何进如何出的,上一篇说了nid是如何进入nat_root的,当然一个nid进入nat_root的情况不止如此呢,还包括如果读磁盘中已经存在的一个nid,这个nid的缓存也是存在这里的。
那么现在说说nat_root中的nid是如何刷回去的!
涉及一个函数:__del_from_nat_cache
两个地方调用:
1)f2fs_balance_fs_bg --> try_to_free_nats --> __del_from_nat_cache 【内存紧张的时候,直接丢弃】
2)destroy_node_manager --> __del_from_nat_cache 【写checkpoint】
对于第一种情况,有个疑问:如果这个nat_entry并没有写回磁盘那怎么办?!
这个情况不会发生的,你会发现在函数 f2fs_write_node_page 中当nat中设置一个新地址时,会调用_set_nat_cache_dirty,将其从本来待的nat_entries链表中删除,然后放入nat_set_root中这个block对应的那个list链表中去。是不是很拗口?
解释一下:nat_set_root是我们今天要看的第三棵基数树了,也是最后的一棵树了,杀千刀的node管理器终于要见底了,这里是一个nid的最后归宿啦!nat_set_root是棵什么树呢?这棵基数树的索引是这个nat_entry所在的nat块,这个块中所有的所有的nat_entry都链到在他的entry_list中的!都是脏的块哇!有没有!
struct nat_entry_set {
struct list_head set_list; /* link with other nat sets */
struct list_head entry_list; /* link with dirty nat entries */
nid_t set; /* set number*/
unsigned int entry_cnt; /* the # of nat entries in set */
};
上面标蓝的第一条线,在丢弃这些cache之前,要用段管理器中的锁的:nat_tree_lock。 down_write(&nm_i->nat_tree_lock) 和 up_write(&nm_i->nat_tree_lock) 要套起来,set_node_addr中也要有这个锁啊,果然,这个函数一上来,这个锁就套上了!
至此,我们知道了nid去哪儿了!原来,nat_root,只是nid暂时的一站,真的是暂时的一站,立马,你就去了就到了nat_set_root中自己的那个nat_entry_set中去了!
好了,就这样了!nat_entry_set中的东西到write_checkpoint的时候清除了!
down_write(&nm_i->nat_tree_lock);
f2fs解析(十)nid 如何从nat_root中删除的更多相关文章
- f2fs解析(八)node 管理器中的node_info
free_info 功成身退,node_info顺利接班. // 这里还是蛮复杂的一件事,如果不搞清除的话,这个历史性的接班工作我们就接不上 上面说到 alloc_nid 和 alloc_nid_do ...
- f2fs解析(七)node管理器中的 free_nid 结构体
除了node_info之外, node管理器中还有还有个重要的数据结构: struct free_nid { struct list_head list; /* for free node id li ...
- SQL Server 2008空间数据应用系列十二:Bing Maps中呈现GeoRSS订阅的空间数据
原文:SQL Server 2008空间数据应用系列十二:Bing Maps中呈现GeoRSS订阅的空间数据 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Se ...
- 剑指Offer(二十八):数组中出现次数超过一半的数字
剑指Offer(二十八):数组中出现次数超过一半的数字 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...
- 剑指Offer(三十五):数组中的逆序对
剑指Offer(三十五):数组中的逆序对 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/bai ...
- !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
http://hujiaweibujidao.github.io/blog/2013/11/18/android-ndk-and-opencv-development-3/ Android Ndk a ...
- 基于简单sql语句的sql解析原理及在大数据中的应用
基于简单sql语句的sql解析原理及在大数据中的应用 李万鸿 老百姓呼吁打土豪分田地.共同富裕,总有一天会实现. 全面了解你所不知道的外星人和宇宙真想:http://pan.baidu.com/s/1 ...
- WCF技术剖析之二十: 服务在WCF体系中是如何被描述的?
原文:WCF技术剖析之二十: 服务在WCF体系中是如何被描述的? 任何一个程序都需要运行于一个确定的进程中,进程是一个容器,其中包含程序实例运行所需的资源.同理,一个WCF服务的监听与执行同样需要通过 ...
- “全栈2019”Java第九十五章:方法中可以定义静态局部内部类吗?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
随机推荐
- 关于const和define的内存分配问题的总结
关于const和define的内存分配问题 const与#define宏定义的区别----C语言深度剖析 1, const定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量,存放在静 ...
- 安卓第九天笔记-Activity
安卓第九天笔记-Activity 1.创建Activity 一个界面对应一个activity 创建一个Activity 1.写一个JAVA类,继承Activity publicclass CalcA ...
- 解决tableViewCell分割线不到左边界的问题
在tableView控制器的.m文件中任何位置加入以下两个方法即可解决 /** * 下面两个方法解决cell分割线不到左边界的问题 */ -(void)viewDidLayoutSubviews { ...
- XCode的代码块备份
以上三个的注释可以从下面的代码依据个数拷贝和删除: /** * <#comment#> * * @param <#one#> * * @param <#two#> ...
- 通过设置虚拟机(ubantu15.10)的分辨率达到全屏效果
最近搭建了一个ubantu 15.10虚拟机,怎么折腾都不能全屏显示.虽然我已经点了, 还是无法达到真正的全屏. 查了一下,http://jingyan.baidu.com/article/0964 ...
- 使用JUnit4进行java单元测试
第一步:创建一个java工程,在工程中创建一个被单元测试的Student数据类,代码如下: package com.junittest.yu; public class Student { priv ...
- Linux套接字编程
网络中的进程是如何通信的? 在网络中进程之间进行通信的时候,那么每个通信的进程必须知道它要和哪个计算机上的哪个进程通信.否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行 ...
- C++中const用法总结
1修饰变量/指针 注意以下几种修饰的区别: (1)const int * a; (2)int const *a; (3)int * const b; (4)int const* const c; 其中 ...
- CIO的职责、条件及价值
从ERP项目的成功率中,我们可以知道企业的信息化道路是漫长的:从企业对ERP的投资热情中,我们可以知道企业信息化已经是企业的生死之战.对于信息化的成功,许多专家.学者都在强调“一把手”工程,ISO要“ ...
- oracle错误(ORA-01691),单个数据文件大小限制问题
1.问题:数据库从其他库同步一张大表时,出现错误 ERROR at line : ORA-: illegal parameter value in OCI lob function ORA-: pre ...