在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?
顺便说一下:我期待并欣赏在内核中打开文件的谴责,但我所做的确实需要它。 :)谢谢!
答案 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
的实现中得到了这个:
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来向上移动树。
IS_ROOT
。 IS_ROOT
取一个dentry,如果它返回true,那么就没有意义了。我们是文件系统的根,它可能不是我们命名空间的根。
现在我了解了一些,我意识到J-16 SDiZ的帖子很有帮助:
他参考了获得真实路径的tomoyo实现:
http://lxr.linux.no/linux+v2.6.37/security/tomoyo/realpath.c#L86