如何在Linux内核中获取另一个struct文件的父文件的struct文件

时间:2012-03-25 01:25:45

标签: linux-kernel

在Linux内核中:我有一个目录的文件(即'struct file')。我们称之为f_child。我需要父目录的文件引用。

我目前正在检索这个:

1)从f_child的f_dentry-> d_parent和f_vfsmnt创建一个'struct path'。当然,我检查d_parent是非空的。

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

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

似乎有效。我担心我在步骤1中假设父和子的vfs挂载是相同的。那会不会咬我?有没有更好的方法呢?显然,我不太了解vfs挂载结构。属于同一个超级块的所有dentries是否都具有相同的vfs mount?

顺便说一下:我期待并欣赏在内核中打开文件的谴责,但我所做的确实需要它。 :)

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

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

无论如何,如果我正确地读到这个,那么一个变性树是从对应于文件系统的超级块生成的,而不是vfsmount。所以我必须检查以确保d_parent和dentry具有相同的vfs mount。我在下面提到的mnt_root检查可以实现这一点。

所以,它不是null我需要在第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,那么就没有意义了。我们是文件系统的根,它可能不是我们命名空间的根。

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

    Linux Kernel dentry and inode

    他参考了获得真实路径的tomoyo实现:

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