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

除了node_info之外, node管理器中还有还有个重要的数据结构:

145 struct free_nid {
146     struct list_head list;  /* for free node id list */
147     nid_t nid;      /* node id */
148     int state;      /* in use or not: NID_NEW or NID_ALLOC */
149 };       

这个结构体体很简单,比刚才的node_info轻量级多了,仅仅是标识了当前可以使用的nid,以及这个nid的状态,一个指针将其与别的free_nid连成一串。

别看这个结构简单,也被node管理器中两个 “索引” 管理着呢:1)基数树 free_nid_root; 2)链表 free_nid_list;【参见函数add_free_nid】

但是咱这个free_nid 也总得有个出栈的时候吧,你得为国家建设做贡献,不然在占个位置干嘛呢!

alloc_nid 函数会从 free_nid_list 链表中选出一个free_nid出来,这个nid算是被选中了,但是此时并不会把这个节点从list删除,为什么呢?因为选中nid只是万里长征的第一步,后面还有许多事情要做呢,这些事情没做完我们就不能删除,如果中途失败,那么咱这个nid算是分配出去了,到哪儿找呢!所以要给自己回旋的余地啊,f2fs的代码巧妙地把此时free_nid的状态从NID_NEW变成了NID_ALLOC,什么时候完全从链表中删除呢?

函数:alloc_nid_done ! 其中,狠心的__del_from_free_nid_list,会将这个节点从链表中删除,并删除基数树中的索引。然后其在slab中的位置也被释放了!

1634 /*
1635  * alloc_nid() should be called prior to this function.
1636  */
1637 void alloc_nid_done(struct f2fs_sb_info *sbi, nid_t nid)
1638 {
1643     i = __lookup_free_nid_list(nm_i, nid); //从基数树中删除这个节点
1644     f2fs_bug_on(sbi, !i || i->state != NID_ALLOC);
1645     __del_from_free_nid_list(nm_i, i); //从链表中删除..
1648     kmem_cache_free(free_nid_slab, i);
1649 }
1650 
1451 static void __del_from_free_nid_list(struct f2fs_nm_info *nm_i,
1452                         struct free_nid *i)
1453 {
1454     list_del(&i->list);
1455     radix_tree_delete(&nm_i->free_nid_root, i->nid);
1456 }
1

到这里我们基本了解了free_nid的一生。并且也基本猜到了他的一个作用:为node_info的出场暖场呢!

时间: 2024-10-24 10:08:14

f2fs解析(七)node管理器中的 free_nid 结构体的相关文章

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

node是f2fs重要的管理结构, 它非常重要! 系统挂载完毕后, 会有一个f2fs_nm_info结构的node管理器来管理node的分配. f2fs_nm_info中最让人疑惑的是几颗基数树: 490 struct f2fs_nm_info { 491 block_t nat_blkaddr; /* base disk address of NAT */ 492 nid_t max_nid; /* maximum possible node ids */ 494 nid_t next_sca

怎么做到在磁盘管理器中不显示盘

如下图: 在磁盘管理器中,只有H盘和C盘, 在资源管理器中,却有B.Y.Z等盘符,这是怎么做到的?

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

一.发现问题 启动SQLSERVER的数据分析服务失败 查看系统日志错误如下: 双击错误后显示详细错误: 元数据管理器中存在错误. 实例化来自文件“\\?\C:\Program Files\Microsoft SQL Server\MSAS11.MSSQLSERVER\OLAP\Data\Tfs_Analysis.0.db\vDimTestCaseOverlay.874.dim.xml”的元数据对象时出错. 二.解决问题-数据库 然后我手动尝试将“C:\Program Files\Microso

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

互联网可以说是一把名副其实的双刃剑.一方面其可以提高工作效率.给企业提供充分的资源;另一方面如果管理不严,也会带来很多的隐患.如员工在上班时间玩游戏.炒股等等.为此现在很多企业希望对员工的网络行为进行限制.如禁止上班时间玩"偷菜"游戏等等.但是由于工作的需要,也不能够完全禁止用户访问网络.如下图所示,用户可以访问阿里巴巴等商业网站,但是QQ.新浪等网站则不允许访问.作为网络安全管理人员,该如何来实现这种区别待遇呢?笔者在这篇文章中,以Forefront产品为例,谈谈这方面的技巧与经验.

windows 进程管理器中的内存是什么意思?

*内存 - 工作集:私人工作集中的内存数量与进程正在使用且可以由其他进程共享的内存数量的总和. *内存 - 峰值工作集:进程所使用的工作集内存的最大数量. *内存 - 工作集增量:进程所使用的工作集内存中的更改量. *内存 - 私人工作集:工作集的子集,它专门描述了某个进程正在使用且无法与其他进程共享的内存数量. *内存 - 提交大小:为某进程使用而保留的虚拟内存的数量. *内存 - 页面缓冲池:由内核或驱动程序代表进程分配的可分页内核内存的数量.可分页内存是可写入其他存储媒体(例如硬盘)的内存

《BI项目笔记》SSAS部署时发生的问题——元数据管理器中存在错误 解决办法

原文:<BI项目笔记>SSAS部署时发生的问题--元数据管理器中存在错误 解决办法 在生成和部署期间出错.是否继续?解决办法: 用Microsoft SQL Server Management Studio 连接Analysis Services 然后删除多维数据库,重新布署.这样就OK的.

在“DNS管理器”中手工增加DNS主机(A)或者别名(CNAME)记录时,出现被拒绝的错误

问题现象: AD域控制器操作系统为Win2008R2,在"DNS管理器"中手工增加DNS主机(A)或者别名(CNAME)记录时,出现被拒绝的错误.但是将客户端加入域后,在"DNS管理器"中能看到对应的客户端的DNS主机(A)记录. 在系统日志中,能查看到ID为4015的错误日志: 事件类型:   错误 事件来源:   DNS 事件种类:   无 事件 ID:    4015 日期:       2016/4/1 事件:       1:06:53 用户:      

MFC中的NMHDR结构体

建立spin控件,创建UDN_DELTAPOS一个消息函数后: void CSpinDlg::OnDeltaposSpin1(NMHDR* pNMHDR, LRESULT* pResult) { NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR; // TODO: Add your control notification handler code here *pResult = 0; } 问题1:参数NMHDR* pNMHDR, LRESULT* pResul

C中多变的结构体 struct typedef

 这几天看代码,看到几种类型的结构体,结构声明如下: struct    book{ string name; int price; int num; }; 此种结构定义结构变量的格式如下: struct    book      student; struct      book{ string name; int price; int num; }student; 此种形式代表声明结构的过程和定义结构变量的过程被合并成一步 typedef    struct  (book){   //b