f2fs解析(八)node 管理器中的node_info
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的更多相关文章
- f2fs解析(七)node管理器中的 free_nid 结构体
除了node_info之外, node管理器中还有还有个重要的数据结构: struct free_nid { struct list_head list; /* for free node id li ...
- f2fs源码解析(五) node管理结构梳理
node是f2fs重要的管理结构, 它非常重要! 系统挂载完毕后, 会有一个f2fs_nm_info结构的node管理器来管理node的分配. f2fs_nm_info中最让人疑惑的是几颗基数树: s ...
- 如何在URL筛选管理器中过滤不需要的URL
互联网可以说是一把名副其实的双刃剑.一方面其可以提高工作效率.给企业提供充分的资源;另一方面如果管理不严,也会带来很多的隐患.如员工在上班时间玩游戏.炒股等等.为此现在很多企业希望对员工的网络行为进行 ...
- 无法将从VSS中的解决方案添加到TFS的源代码管理器中
VSS是一种非常有用的项目文件管理工具,百度百科的解释是:VSS 的全称为 Visual Source Safe .作为 Microsoft Visual Studio 的一名成员,它主要任务就是负责 ...
- 元数据管理器中存在错误。 实例化来自文件“\\?\C:\Program Files\Microsoft SQL Server\MSAS11.MSSQLSERVER\OLAP\Data\Tfs_Analysis.0.db\vDimTestCaseOverlay.874.dim.xml”的元数据对象时出错。
一.发现问题 启动SQLSERVER的数据分析服务失败 查看系统日志错误如下: 双击错误后显示详细错误: 元数据管理器中存在错误. 实例化来自文件“\\?\C:\Program Files\Micro ...
- Visual studio2019配置OPENCV 时属性管理器中没有Microsoft.Cpp.x64.user的解决办法
方法一:重新下载Visual studio2017,再次打开2019就会出现Microsoft.Cpp.x64.user,感觉有些麻烦,也占电脑空间,推荐方法二. 方法二:与方法一原理相同,下载201 ...
- SurvivalShooter学习笔记(八.敌人管理器)
敌人管理器:管理敌人的随机出生点创建 在场景中建立几个空物体,作为敌人的出生点 public class EnemyManager : MonoBehaviour { public PlayerHea ...
- TFS 中如何将项目加入已有的源代码管理器中?
Visual Studio 的某解决方案已经加入 Team Foundation Server,现在再将已经存在的项目加入到解决方案中,可是签入时,并没有把新加入的项目签入,怎么办呢? 在团队资源管理 ...
- f2fs解析(三)NAT中如何区分inode和其他dnode
首先,我们要知道NAT中的每个表项都对应着MAIN AREA区域中NODE段的一个block,还要知道NODE block很特别,block末尾会有一个node footer结构: 243 struc ...
随机推荐
- Snort - manual 笔记(三)
1.6 Reading pcap files Snort 不仅可以监听interface, 还可以读取和分析已经捕获的数据包. 1.6.1 Command line arguments 下面的命令都可 ...
- android assets文件夹资源的访问
1.assets文件夹里面的文件都是保持原始的文件格式 . 2.assets中的文件只可以读取而不能进行写的操作. 3.assets目录下的资源文件不会在R.java自动生成ID,所以读取assets ...
- Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例(转)
Java中==.equals.hashcode的区别与重写equals以及hashcode方法实例 原文地址:http://www.cnblogs.com/luankun0214/p/4421770 ...
- 系统在某些情况下会自动调节UIScrollView的contentInset
出现情景 如果一个控制器(ViewController)被导航控制器管理,并且该控制器的第一个子控件是UIScrollView,系统默认会调节UIScrollView的contentInset UIE ...
- 多线程基础(五)NSThread线程通信
5.多线程基础 线程间通信 什么叫线程间通信 在一个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另一个线程 在1个线程中执行完特定任务后, ...
- Swift Standard Library: Documented and undocumented built-in functions in the Swift standard library – the complete list with all 74 functions
Swift has 74 built-in functions but only seven of them are documented in the Swift book (“The Swift ...
- Monyer.cn黑客小游戏
花了一天的时间,Monyer给大家带来了一个有趣的东东——拥有15个关卡的黑客小游戏. 入口http://monyer.com/game/game1 因为一直以来都是大家跟我一起学习网络技术嘛,所以这 ...
- 手动将自定制的WebPart部署到 SharePoint 2010 中
1.搭建好开发环境,建立webpart工程,写代码. 2.修改assembly.cs文件 在部署前,需要修改assembly文件,增加以下两句: using System.Security; [a ...
- Effective Java 54 Use native methods judiciously
Java Native Interface(JNI) allows Java applications to call native methods, which are special method ...
- PHP模拟发送POST请求之四、加强file_get_contents()发送POST请求
使用了笨重fsockopen()方法后,我们开始在PHP函数库里寻找更简单的方式来进行POST请求,这时,我们发现了PHP的文件函数也具有与远程URL交互的功能. 最简单的是fopen()和fread ...