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第 ...
随机推荐
- 详解HTML5中rel属性的prefetch预加载功能使用
在HTML5中,有个很有用但常被忽略的特性,就是预先加载(prefetch),它的原理是: 利用浏览器的空闲时间去先下载用户指定需要的内容,然后缓存起来,这样用户下次加载时,就直接从缓存中取出来,效率 ...
- App开发流程之增加预编译头文件
在继续增加预编译头文件前,先稍等. Xcode为我们创建了一个模板项目,很棒!但有一点不太令人满意,问题就在下图中: 这是一个新项目的初始文件目录,几乎所有文件都在同一级目录下,随着项目文件数量急速增 ...
- BeanFactory not initialized or already closed - call 'refresh' before accessing beans解决办法
今天在写Spring程序时遇到了一个很常见的错误,而我以前好像一直没碰到过,今天才见到这个错误,经过研究解决了这个错误,犯这个错误真是不应该啊. log4j:WARN No appenders cou ...
- IOS开发中(null)与<null>的处理
不小心在开发过程中,得到了(null)以及<null>的返回值,找了好长时间只找到了一个关于<null>的. 由于要根据返回值进行判断,做出必要反应,因此必须知道返回值所代表的 ...
- iOS之UI--通讯录的实例关键知识技术点积累
通讯录的实例关键知识技术点积累 效果展示: 作为博文笔记,既然是笔记,目的是为了能够以后做这个项目能够快速上手,如果这是我下一次阅览这个博文笔记,那么我应该先空手从零开始做,需求也就是这个项目的展示效 ...
- Memcache笔记05-Memcache安全性
Memcache服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程,这样如果服务器是直接暴露在互联网上的话是比较危险,轻则数据泄露被其他无关人员查看,重则服务器被入侵,因为Mecache是以 ...
- .net串口通信
背景: 前一段时间需要写一个向蓝牙模块发消息的功能. 对蓝牙的机制不太了解,所以一直在查资料, 但始终没找到我需要的东西,还误以为需要配套的一套开发模板和开发包, 偶然间发现只需要简单的串口通信,并且 ...
- cocos2d-x之单点触碰初试
bool HelloWorld::init() { if ( !Layer::init() ) { return false; } Size size=Director::getInstance()- ...
- 枚举Enumerations
枚举,类似于数据库中的表. 难点:实例值和原始值. import Foundation enum Sex{ case Male(Int,Int) case Female(String) } var b ...
- Eclipse编译去除svn文件夹
使用Eclipse编译文件后,classes文件中总是有.svn的文件夹,这些文件没有什么用,而且影响build的速度 "Project->Properties->Java Bu ...