2015-08-25 73 views
2

當從程序中要求的保險絲管理目錄打電話給open系統調用,創建一個空文件(O_WRONLY | O_CREAT | O_TRUNC),從我的FUSE文件系統實現以下功能被執行:FUSE開放的系統調用機制

  1. getattr(返回錯誤,因爲文件不存在)
  2. create
  3. fgetattr

我的問題是:

這些函數調用對於Linux中的所有文件系統(包括本機文件系統,如ext4)通用,還是FUSE內部行爲?

strace - 在程序中,我只能看到一個open系統調用。

回答

1

經過幾天的研究和盯着Linux內核和FUSE源代碼,我瞭解到發生了什麼。

首先,我要說的是,releasefgetattr後未執行open系統調用時調用close時執行,但是。所以我編輯了我的問題刪除它。

那麼,我的主要問題是,strace顯示我打電話給open系統調用,但我的FUSE程序日誌顯示三個函數被執行。因此我對其他文件系統的問題。

Linux kernel documentation我們可以看到內核VFS詳細解釋:

要查找一個inode要求VFS調用的 父目錄inode的lookup()方法。這個方法是由inode所在的特定的 文件系統實現安裝的。一旦VFS具有 所需的dentry(以及因此inode),我們就可以完成所有那些無聊的事情,如open(2)文件或stat( 2)

即,在文件系統FUSE,指lookup呼叫在低電平API,或在高水平API一個getattr(因爲i節點路徑平移由libfuse處理)。用戶級代碼。其他系統調用,如mkdiropenO_CREAT標誌,也需要一個lookup,在這種情況下確認負分區之前做任何事情。點1解決。

你得到的dentry不應該有一個inode(即它應該是一個負dentry)。

實現到內核中的文件系統,如ext4,也執行它們的功能,以lookup。但你不能從常見的工具(如strace)(你需要像kernelshark,awesome stuff之類的東西)看到它們。

ext4 lookup function(我運行一個Linux內核3.13)

點3的fgetattr函數調用更關係到libfuse內部。我不知道確切的原因,但在執行如mkdircreate之類的函數後,由libfuse執行lookup。請記住,在高級API中,lookupgetattr(或fgetattr,用於創建的文件)。我認爲這是由於文件/目錄屬性檢查。

您可以在libfuse source code的行動中看到它的創建功能。

加分:請記住,FUSE使用文件屬性(和條目)緩存。如果您將-o attr_timeout安裝選項設置爲0秒,某些調用如stat會將兩個getattr提升到高級API。