- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ext3、ext4 orphan inode机制分析
ext3、ext4 的 orphan inode 机制分析
一、概述
orphan 在英文中是孤儿的意思,在这里取被遗弃、被删除之意。
orphan inode 是什么样的 inode 呢?这种 inode 是怎样产生的呢?
先介绍一个概念,文件的引用计数,准确地说应该是 inode 的引用计数,因为一般来说一个文件会对应
一个 inode。文件的引用计数,简单地说是表示有多少个文件指向该文件,准确地说是文件的硬链接的个
数。
情况 1:设想一个进程,open 一个文件,然后 unlink 该文件,然后进行文件读写。这是允许的,并且在
进程退出时,内核会自动将引用计数为 0 的文件删除。
但是如果该进程尚未退出之前,系统崩溃了,那么,内核就没有机会将已被 unlink、并且引用计数为 0
的 inode 从磁盘上删除了。
情况 2 :设想我们正在截断一个大文件(系统调用truncate ),但是操作尚未完成,系统就崩溃了。同样,
内核也没有办法将该文件的所有数据块全部删除了。
ext3、ext4 的 orphan inode 机制就是处理上述两种情况的。基本思想是这样的:如果要删除或截断一个
inode ,要先把这个inode 记录到磁盘上的一个特殊的 orphan inode 链表上。如果删除或截断操作能够
正常完成,那么,就从磁盘上的 orphan inode 链表上删除该 inode ;否则,如果删除或截断操作未完成
之前,系统就发生崩溃了,那么,系统重启后,文件系统会遍历磁盘上的 orphan inode 链表,对链表上
的每一个 inode 都重新进行一遍删除或截断操作,以此来保证这些 inode 真正在磁盘上被删除,维护文
件系统的一致性。
内核版本:2.6.35
二、相关数据结构及之间的关系
先总体说一下 orphan inode 的组织。
orphan inode 需要在两个地方组织,分别是在内存中和在磁盘上。不论在哪里,从抽象角度来看,
orphan inode 都被组织成一个单向链表。
1、ext4_inode
struct ext4_inode {
__le32 i_dtime; /* Deletion Time */
}
这个是磁盘上的 inode 的结构,i_dtime 本来表示该 inode 被删除的时间,在 orphan inode 机制中,因
为此时该域的值并不重要,故借用一下,用于记录下一个被 unlink/truncate 的 inode 号。
2、ext4_super_block
struct ext4_super_block {
__le32 s_last_orphan; /* start of list of inodes to delete */
}
这个是磁盘上的 superblock 结构。其中,s_last_orphan 记录的是最近一个被 unlink/truncate 的 inode
号,从抽象角度来看,它就代表磁盘上 orphan inode 单链表的头。
新的 inode 插入 orphan inode 链表时采用“头插法”,也就是说,最近被 unlink/truncate 的 inode 号
会放在 s_last_orphan 中。
这样,磁盘上的 orphan inode 单链表如下图 1 所示。
ext4_super_block{ ext4_inode{ ext4_inode{ ext4_inode{
s_last_orphan i_dtime i_dtime i_dtime=0
} } } }
链表头 第二个 inode 第三个 inode 最后一个 inode
图 1 磁盘上的 orphan inode 链表结构图
3、ext4_inode_info
struct ext4_inode_info {
_
原创力文档


文档评论(0)