linux文件系统的系统分析--(五)路径名的查找

本文深入解析了Linux系统中do_path_lookup函数的工作原理,包括nameidata结构体初始化、link_path_walk核心处理过程、do_lookup实现细节及文件系统切换操作。无论面对多复杂的路径,都能准确高效地完成查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



     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);

       

[cpp]   view plain  copy
  1. static int __follow_mount(struct path *path)  
  2. {  
  3.     int res = 0;  
  4.     while (d_mountpoint(path->dentry)) {  
  5.         struct vfsmount *mounted = lookup_mnt(path);  
  6.         if (!mounted)  
  7.             break;  
  8.         dput(path->dentry);  
  9.         if (res)  
  10.             mntput(path->mnt);  
  11.         path->mnt = mounted;  
  12.         path->dentry = dget(mounted->mnt_root);  
  13.         res = 1;  
  14.     }  
  15.     return res;  
  16. }  
      这个函数和上篇do_add_mount中那个不起眼的while的作用是一样的,做文件系统的切换操作。

      理解了这两个关键点,不管路径名多长,不管跨越了多少个文件系统系统,link_path_walk都会一直走下去的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值