linux文件系统的系统分析--(五)路径名的查找
来源:互联网 发布:vmware mac os 联网 编辑:程序博客网 时间:2024/06/06 02:31
do_path_lookup是文件系统中最基本的函数,也是非常重要的,里面各种情况,各种goto,总之各种坑爹。。
没能把所有的goto都理清,只看了标准情况下的路径查找,但主要的关键点都是一样的,弄清了关键点,心中对文件系统的路径名查找就有了概念。不管绝对路径名,相对路径名,还是带符号链接的,又有什么质的区别呢?
do_path_lookup分为两步:
1、path_init根据绝对路径或者相对路径来初始化nameidata结构体;
2、path_work-->link_path_walk
link_path_walk才是路径查找操作中的核心:
link_path_walk处理代表name的字符串,最后都要通过do_lookup函数来do it
do_lookup:
1、检查具体底层文件系统是否有自己的hash方法(d_op->d_hash)
2、用__d_lookup函数在dentry_hashtable这个hash表中查找
3、如果在hash表中没有找到,就要做真正的lookup:
先根据要找的name和parent的dentry,分配一个dentry结构体
调用具体文件系统的i_op->lookup函数,比如sysfs_lookup
提前看一下sysfs_lookup的查找动作:
sysfs_lookup-->sysfs_find_dirent 根据sysfs_dirent的组织关系,在链表中遍历查找符合name的sysfs_dirent结构体,
然后再创建inode,并将inode和dentry以及sysfs_dirent联系起来。
实际文件系统的lookup方法是一个关键点,它根据父层次的dentry和要查找的name在子层次特有的方法来查找。sysfs的lookup方法
是很简单的,仅仅是遍历一个链表,但实际上基于物理介质的fs的lookup应该是很复杂的,比如omfs就用hash来找,传说的btrfs应该
会用btree来查找吧。
另外一个关键点就是:
done:
path->mnt = mnt;
path->dentry = dentry;
__follow_mount(path);
static int __follow_mount(struct path *path){int res = 0;while (d_mountpoint(path->dentry)) {struct vfsmount *mounted = lookup_mnt(path);if (!mounted)break;dput(path->dentry);if (res)mntput(path->mnt);path->mnt = mounted;path->dentry = dget(mounted->mnt_root);res = 1;}return res;}这个函数和上篇do_add_mount中那个不起眼的while的作用是一样的,做文件系统的切换操作。
理解了这两个关键点,不管路径名多长,不管跨越了多少个文件系统系统,link_path_walk都会一直走下去的。
- linux文件系统的系统分析--(五)路径名的查找
- linux文件系统的系统分析--(五)路径名的查找
- linux文件系统的系统分析--(五)路径名的查找
- linux文件系统的系统分析--开篇
- linux文件系统之路径查找与文件系统的挂载
- linux文件系统之路径查找与文件系统的挂载
- linux文件系统的系统分析--(十七)总结
- linux文件系统的系统分析 1-17
- 文件系统-- 标准路径名查找
- linux文件系统的系统分析--(二)文件系统类型的注册
- linux文件系统的系统分析--(二)文件系统类型的注册
- linux文件系统的系统分析--(二)文件系统类型的注册
- Linux路径名查找
- linux文件系统的系统分析--(三)rootfs的安装
- linux文件系统的系统分析--(六)sysfs下目录的创建
- linux文件系统的系统分析--(十二)vfs层的三个hashtable
- linux文件系统的系统分析--(三)rootfs的安装
- linux文件系统的系统分析--(六)sysfs下目录的创建
- 安装了ReSharper,卸载以后,Vs2010没有了智能提示功能的解决方法
- 代理模式
- 测试8000薪水是这样得到的
- 奇怪的C语言代码
- 关于Jmail不能发送邮件问题
- linux文件系统的系统分析--(五)路径名的查找
- 如何在Android模拟器下添加busybox(图文)
- Java程序员从笨鸟到菜鸟之(二十六)XML之DOM和SAX解析
- 【zz】实现一棵多叉树
- Spring参考手册 mvc:resources 分类:
- 页眉、页脚及页码的设置(fancyhdr宏包的使用)
- 黑马程序员-Ajax原理
- VS2008 读写大文件
- Architecture & Connection