快速业务通道

Linux 文件系统中元数据使用计数的机制

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-09

可以看出,这与前面“创建文件”中介绍的是一样的.

关于 inode 的路径如下:

sys_mkdir() > sys_mkdirat() > vfs_mkdir() > i_op->mkdir()

最终会调用具体文件系统的 mkdir 函数.这里以 Ext2 为例,其调用过程如下:

sys_mkdir() > sys_mkdirat() > vfs_mkdir() > i_op->mkdir()

可以看出,这与前面“创建文件”中介绍的也是一样的.

由此也可以看出,从内存中的元数据结构来看,Linux对文件和目录的管理是一样的.

查找操作

创建了一个对象(文件或目录)后,要使用这个对象,就先进行查找.查找操作是元数据使用的关键操作,基本上所有元数据操作都会以查找操作为起始,只有找到了元数据才能进一步对其进行操作.即使对于创建操作,一开始也要进行查找,只不过要创建的对象还不存在,会查找失败,然后才进行创建.

查找操作的入口函数是 __link_path_walk() ,其调用过程如下:

__link_path_walk() > do_lookup()

到了这里,要做的事情主要是在内存中查找相应文件所对应的 dentry 结构.这会分为两种情况:

(1)该 dentry 结构在内存中

此时,通过哈希就可以获取该 dentry 结构,并将其使用计数递增.

do_lookup() > __d_lookup() > atomic_inc(&dentry->d_count)

(2)该 dentry 结构不在内存中

此时,该 dentry 结构可能从来就没在内存中建立起来,或者在内存中存在过,但已经从 LRU 队列 dentry_unused 中被换出内存.无论如何,都需要从磁盘读取元数据,在内存中建立起 dentry 和 inode 结构.这时所进行的步骤是:

在内存中分配一个dentry结构:

do_lookup() > __d_lookup() > atomic_inc(&dentry->d_count)

这里的 d_alloc() 和前面“创建操作”介绍的一样,会把 dentry 的使用计数初始化为1,并将其父目录的使用计数通过 dget() 递增.

分配了 dentry 结构后,就要从磁盘找出对应的元数据.这个过程因文件系统而异,通过父节点的 inode -> i_op 里的函数来进行.

do_lookup() > __d_lookup() > atomic_inc(&dentry->d_count)

这里以 Ext2 为例,调用的是 ext2_create() ,过程如下:

(1) ext2_lookup() > iget(dir->i_sb, ino);

(2) ext2_lookup() > d_splice_alias() > __d_find_alias() > __dget_locked() > 

     atomic_inc(&dentry->d_count);

前者调用 iget() ,通过 ino 在 inode cache 中查找 inode ,如果找到就返回并增加其引用计数;如果没有找到,就分配一个新的(调用 alloc_inode() ,会把使用计数初始化为1,参照前面“创建操作”),并从磁盘读入相应索引节点,在内存中建立起 inode 结构.

后者则把 dentry 与 inode 结构绑定,并递增了 dentry 的使用计数.

总结一下,查找操作的主要过程就是在内存中查找 dentry 结构,如果找到就递增其使用计数;如果找不到就到磁盘中去取,并在内存建立 dentry 和 inode 结构,同时将它们的使用计数初始化为1.因此查找操作都会增加 dentry 的使用计数,或者递增,或者初始化为1.

元数据操作对使用计数的运用

这里我们举例说明元数据操作对 dentry 使用计数的运用,让大家对其有个比较具体的认识和感觉.

元数据操作的实质就是对元数据进行使用.那么,要使用某个元数据时,在内存中为其建立相应的结构,即 inode 和 dentry .但并不是所有的元数据每时每刻都会有对应的结构在内存中,只有需要时才会建立这些结构,并且在特定的时候又会被换出内存.那么如何管理内存元数据结构的使用,从

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号