170 likes | 376 Views
Linux Filesystem Pathname Lookup. 2008/4/14. Pathname Lookup. 考慮以下兩種情形,傳入不同的 inode 作為參數 絕對路徑,以 ”/” 做為路徑開頭 current->fs->root Ex:/home/user/Desktop 相對路徑 current->fs->pwd Ex:Desktop Lookup 過程中,會先尋找 dentry cache 中的物件,避免大量自檔案系統中讀取. Pathname Lookup.
E N D
Linux FilesystemPathname Lookup 2008/4/14
Pathname Lookup • 考慮以下兩種情形,傳入不同的inode作為參數 • 絕對路徑,以”/”做為路徑開頭 • current->fs->root • Ex:/home/user/Desktop • 相對路徑 • current->fs->pwd • Ex:Desktop • Lookup過程中,會先尋找dentry cache中的物件,避免大量自檔案系統中讀取
Pathname Lookup • Consideration • Access rights of each directory • Symbolic link • Symbolic links may induce circular references • Another mounted filesystem • Namespace
path_lookup 指標 檔案路徑名稱 如何存取被查詢檔案 查詢運算的結果 當查詢路徑為絕對路徑時,取得根目錄的dentry object,開始解析 當查詢路徑為相對路徑時,取得當前路徑的dentry object,開始解析
path_walk 重設total_link_count,此counter會限制符號連結的查詢數目,避免查詢過久 呼叫__link_path_walk
link_path_walk 取得flag,決定查詢處理的行為 跳過查詢路徑前面的所有’\’ 若剩下的路徑已為空,則進行目前的dentry object的有效性驗證 若depth不為0,則表示正在進行符號連結的查詢
link_path_walk 檢查上一層目錄的權限是否允許對其下的元件進行處理,若不允許,則會跳出迴圈 以’\’作為分隔符號,切出下一個要查詢的元件名稱,並計算出一個32bit的hash值,供dentry cache查詢時使用
link_path_walk 若目前的路徑已是根目錄,則不會再往上爬 。ex:/ 若取得的元件名稱為’..’,則會呼叫follow_dotdot(),想辦法回到上一層目錄 若目前的目錄不等於目前檔案系統的根目錄,則往上爬一層目錄 。ex:/mnt/cdrom/subdir1/subdir2 -> /mnt/cdrom/subdir1 若目前檔案系統的目錄並非掛載在另一個檔案系統上,則已經達到檔案系統的根目錄,不會再往上爬。ex: /mnt/cdrom,但/dev/cda已經自/mnt上斷線 目前的目錄是此檔案系統的根目錄,但是此檔案系統又掛在另一檔案系統的某個目錄下,則切換檔案系統,往上爬一個目錄。ex: /mnt/cdrom -> /mnt
link_path_walk 以底層檔案系統的hash function更新hash值 呼叫do_lookup(),取得目前元件的dentry object
do_lookup 在dentry cache中搜尋是否有該檔名的dentryobject 若無該物件,則自從磁碟中讀取,並且建立dentryobject放置於dentry cache中 若有,則驗證該dentry object的有效性,若已失效,則重新從磁碟中讀取
link_path_walk 以底層檔案系統的hash function更新hash值 呼叫do_lookup(),取得目前元件的dentry object 檢查剛剛被解析的元件是否指向符號連結,若是,則需解析符號連結的路徑
do_follow_link link_count用於控制巢狀符號連結的次數,超過MAX_NESTED_LINKS即回傳錯誤碼,避免無窮迴圈 total_link_count控制總符號連節的數目,避免kernel查詢過長的符號連結造成系統的緩慢 取得符號連結pathname最終的dentry object
__do_follow_link 更新檔案的access time屬性 利用nd與pathname取得該符號連結最終的dentry object遞迴呼叫link_path_walk,
link_path_walk 以底層檔案系統的hash function更新hash值 呼叫do_lookup(),取得目前元件的dentry object 檢查剛剛被解析的元件是否指向符號連結,若是,則需解析符號連結的路徑 檢查剛剛被解析的元件是否是目錄,若不是,則回傳錯誤碼。因為目前解析的元件是在路徑的中間部分,所以必定為目錄或是符號連結。若是已達到’last_component:’,則可以驗證有效性後結束程式
Different Between 2.4 and 2.6 • Support for new file systems • IBM JFS • SGI XFS • NFS v4 • Andrew File System (AFS) • ReiserFS v4 (planned) • Other enhancements • Device mapper infrastructure (LVM2, EVMS) • Extended Attribute / Access Control List (ACL) support • Zero-copy NFS