【问题标题】:How do you get the struct file of the parent of another struct file in the Linux Kernel如何在 Linux 内核中获取另一个结构文件的父结构文件
【发布时间】:2012-03-25 01:25:44
【问题描述】:

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

我目前正在这样检索这个:

1) 从 f_dentry->d_parent 和 f_child 的 f_vfsmnt 创建一个“结构路径”。当然,我会检查 d_parent 是否为非空。

2) 使用 d_path 获取 f_child 的父级的路径(即字符串,而不是结构路径...一个 char *),传入我们从步骤 1 中检索到的路径。

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

它似乎工作。我担心我在第 1 步所做的假设,即父母和孩子的 vfs 安装将是相同的。那会在某个时候咬我吗?有没有更好的方法来做到这一点?显然,我不太了解 vfs 安装结构。属于同一个超级块的所有dentries 是否具有相同的vfs mount?

顺便说一句:我期待并感谢在内核中打开文件的指责,但我正在做的事情确实需要它。 :)

谢谢!

【问题讨论】:

    标签: linux-kernel


    【解决方案1】:

    我偶然发现了这个非常有用的页面: http://kedar.dumpstack.com/pubs/al_vfsmounts.html

    (也张贴在这里以防万一): http://kerneltrap.org/node/3749

    虽然简短,但对于任何试图开始理解 vfs 工作原理的人来说都是有价值的,因为它超出了描述部分(超级块、inode、dentry 等)的范围,还描述了它们如何协同工作以创建用户交互的命名空间与。

    无论如何,如果我没看错的话,一棵树状树根植于与文件系统相对应的超级块,而不是 vfsmount。所以我必须检查以确保 d_parent 和 dentry 具有相同的 vfs 挂载。我在下面提到的mnt_root 检查完成了这一点。

    所以,我需要在第 1 步检查这不是空值,而是这两件事(我从 fs/dcache.c 中的 __d_path 的实现中得到这个):

    1. mnt_root。如果 f_child 的 f_dentry 和它的 f_vfsmnt 的 mnt_root 一样,那我就不能看 f_dentry->d_parent。我们在山的根部。如果我想超越那个dentry,我必须通过查看dentry f_vfsmnt->mnt_mountpoint 和vfsmount f_vfsmnt->mnt_parent 来向上移动树。

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

    现在我明白了一些,我意识到 J-16 SDiZ 的帖子很有帮助:

    Linux Kernel dentry and inode

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

    http://lxr.linux.no/linux+v2.6.37/security/tomoyo/realpath.c#L86

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 2012-01-10
      • 2017-02-10
      • 1970-01-01
      • 1970-01-01
      • 2018-12-18
      • 1970-01-01
      相关资源
      最近更新 更多