Linux kernel 如何获取Linux内核中另一个结构文件的父结构文件

Linux kernel 如何获取Linux内核中另一个结构文件的父结构文件,linux-kernel,Linux Kernel,在Linux内核中:我有一个目录文件(即“结构文件”)。让我们称之为f_child。我需要父目录的文件引用 我目前正在这样检索: 1) 从f_dentry->d_父项和f_子项的f_vfsmnt创建“结构路径”。当然,我检查d_父项是否为非null 2) 使用d_path获取f_child的父级的路径(即字符串,而不是结构路径…字符*),传递我们从步骤1检索到的路径 3) 将该字符串传递给filp_open,它返回我想要的结构文件* 它似乎起作用了。不过,我担心我在步骤1中所做的假设,即父级和子

在Linux内核中:我有一个目录文件(即“结构文件”)。让我们称之为f_child。我需要父目录的文件引用

我目前正在这样检索:

1) 从f_dentry->d_父项和f_子项的f_vfsmnt创建“结构路径”。当然,我检查d_父项是否为非null

2) 使用d_path获取f_child的父级的路径(即字符串,而不是结构路径…字符*),传递我们从步骤1检索到的路径

3) 将该字符串传递给filp_open,它返回我想要的结构文件*

它似乎起作用了。不过,我担心我在步骤1中所做的假设,即父级和子级的vfs安装量是相同的。那会在某个时候咬我吗?有更好的方法吗?显然,我对vfs的安装结构了解不够。属于同一超级块的所有假牙是否具有相同的vfs支架

顺便说一句:我期待着,也很感激,在内核中打开一个文件会受到谴责,但我所做的确实需要它。:)


谢谢

我偶然发现了这个非常有用的页面:

(也张贴在这里,以备不时之需):

简而言之,这对于任何试图开始理解vfs工作原理的人来说都是很有价值的,因为它不仅描述了各个部分(superblock、inode、dentry等),还描述了它们如何协同工作以创建与用户交互的命名空间

无论如何,如果我没有看错的话,dentry树是从一个与文件系统相对应的超级块中生成的,而不是vfsmount。因此,我必须检查以确保d_父级和dentry具有相同的vfs安装。下面我提到的
mnt\u root
检查可以实现这一点

因此,我需要在第1步检查它不是空的,但是这两件事(我从中的
\uu d_path
实现中得到):

  • mnt\u root
    。如果f_child的f_dentry与其f_vfsmnt的mnt_根相同,那么我不能查看f_dentry->d_parent。我们在山的根部。如果我想在dentry上方移动,我必须通过查看dentry f_vfsmnt->mnt_挂载点和vfsmount f_vfsmnt->mnt_父节点,向树的上方移动

  • 是根目录
    IS_ROOT
    接受一个dentry,如果它返回true,那么在上面查看就没有意义了。我们位于文件系统的根,它可能不是名称空间的根

  • 现在我了解了更多,我意识到J-16 SDiZ的帖子很有帮助:

    他引用了tomoyo实现的获取真实路径: