2012-03-25 44 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

相關問題