2012-03-25 29 views
0

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

我目前抓取这个像这样:

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

2)获取的路径(即,字符串,而不是使用d_path f_child的母体的结构路径...一个char *),并传入我们从步骤1

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

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

btw:我期待并欣赏在内核中打开文件的责备,但我所做的确实需要它。 :)

谢谢!

回答

1

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

(这里也张贴在情况下消失): http://kerneltrap.org/node/3749

虽然短,这是任何人试图开始了解运作有价值因为它超越了描述部件(超级块,inode,dentry等)以描述它们如何一起工作来创建用户交互的命名空间。

无论如何,如果我正确地读取它,那么一个dentry树就会根据与文件系统相对应的超级块而不是vfsmount进行根植。所以我必须检查以确保d_parent和dentry具有相同的vfs安装。我在下面提到的mnt_root检查完成了这一点。

因此,它不为空,我需要检查在步骤1,但这两件事情(我得到这个从__d_pathfs/dcache.c实施):

  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

他引用得到一个真实路径的智代执行:

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

相关问题