快速业务通道

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

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-09
而决定其何时在内存中,何时被换出,这就是通过 dentry 的使用计数来实现的.

下面我们以两个常见的元数据操作为例,来看 Linux 如何管理内存元数据结构的使用.

(1) getattr 操作

Linux 内核中有很多操作都会调用到 getattr ,我们举其中的一个来说明:sys_stat() > vfs_stat_fd() .

函数 vfs_stat_fd() 比较短,我们将其内容都列出来:

int vfs_stat_fd(int dfd, char __user *name, struct kstat *stat)

{

    struct nameidata nd;

    int error;



    error = __user_walk_fd(dfd, name, LOOKUP_FOLLOW, &nd);

    if (!error) {

        error = vfs_getattr(nd.mnt, nd.dentry, stat);

        path_release(&nd);

    }

    return error;

}

这里先调用了 __user_walk_fd() ,这个函数继续走下去的路径是:

__user_walk_fd() > do_path_lookup() > link_path_walk() > __link_path_walk()

可以看出, __link_path_walk() 就是前面介绍过的查找操作.如果成功返回,就会增加 dentry 的使用计数,否则就不增加.而如果查找成功,就进行具体的 getattr 的工作,调用的是 vfs_stat_fd() 的主体函数 vfs_getattr() .这之后,会调用 path_release() ,这个函数的路径是:

__user_walk_fd() > do_path_lookup() > link_path_walk() > __link_path_walk()

函数 dput() 会将 dentry 的使用计数减少,这个函数我们将在后面详细介绍.

总结一下, getattr 操作要查找元数据,找到后,就增加 dentry 的使用计数,只要 dentry 的使用计数不为0,它就会存在于 dcache 中,而不会被换出内存.当 getattr 的主要操作步骤完成后,就会减少 dentry 的使用计数,表明 getattr 操作已经完成,不再需要使用这个 dentry 了.

(2) link 操作

下面再看一个操作. Link 操作用于创建一个对象链接.其调用路径为:

sys_link() > sys_linkat()

接下来可以分为七个部分:

(1) error = __user_walk_fd(olddfd, oldname,

                       flags & AT_SYMLINK_FOLLOW ? LOOKUP_FOLLOW : 0,

                       &old_nd);

(2) error = do_path_lookup(newdfd, to, LOOKUP_PARENT, &nd);

(3) new_dentry = lookup_create(&nd, 0);

(4) error = vfs_link(old_nd.dentry, nd.dentry->d_inode, new_dentry);

(5) dput(new_dentry);

(6) path_release(&nd);

(7) path_release(&old_nd);

第1步中, __user_walk_fd() 会查找要被链接的文件,这和前面 getattr 中的函数一样,会把这个文件对应的 dentry 的使用计数进行递增.它和第7步中的 path_release() 对应.

第2步中, do_path_lookup() 会查找要创建的链接的父目录,它同样会进行查找操作,递增 dentry 的使用计数.它和第6步中的 path_release() 对应.

第3步中, lookup_create() 会创建链接对象的 dentry 结构,这和前面“创建目录”中介绍的函数一样.它和第5步中的 dput() 对应.

这里我们再次看到,一个元数据操作中都会先查找涉及到的元数据,并增加其 dentry 的使用计数,然后在该操作结束的时候递减这些使用计数.

对于 link 操作,我们还要讲讲它的主体函数,也就是 vfs_link() ,其路径为:

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号