再讀FUSE核心原始碼

來源:互聯網
上載者:User

fuse核心模組被載入時,以下初始化常式會被調用,見fuse_init函數<inode.c>。

1.  fuse_fs_init();  註冊fuse檔案系統,建立fuse_inode快取。

2.  fuse_dev_init(); 建立fuse_req快取,載入fuse裝置驅動,用於使用者空間與核心空間交換資訊。

3.  fuse_sysfs_init(); 在/sys/fs目錄下增加fuse節點,在fuse節點下增加connections節點。

4.  fuse_ctl_init(); 註冊fuse控制檔案系統

 

fuse核心模組被卸載時,執行對應的清理工作,見fuse_exit函數<inode.c>

1.  fuse_ctl_cleanup();   登出fuse控制檔案系統

2.  fuse_sysfs_cleanup(); 移除fuse、connections節點。

3.  fuse_fs_cleanup();   登出fuse檔案系統,釋放fuse_inode快取。

4.  fuse_dev_cleanup();  登出fuse裝置驅動程式,釋放fuse_req快取。

 

fuse_conn<fuse_i.h>代表一個fuse串連,當使用者檔案系統被掛載時產生該結構,當檔案系統被卸載時釋放該結構,其主要用於管理各個請求隊列,核心會為所有掛載的檔案系統維護一個fuse_conn的鏈表(fuse檔案系統可能會被掛載多次)。

 

fuse_conn的connected欄位用於表示串連的狀態,成功掛載後為1,當檔案系統被卸載,串連被中斷或是裝置驅動被釋放後,該欄位為0,此時這個connection(掛載的檔案系統)不能提供正常服務。在fuse_request_send中會檢查該欄位,只有串連正常fuse檔案系統才會發送請求。

 

fuse中每個請求用一個fuse_req<fuse_i.h>的結構表示,該結構中包含fuse請求的輸入輸出參數,請求對象的inode、file等。

 

每個fuse的輸入、輸出參數都支援三個參數,見fuse_in、fuse_out結構的定義<fuse_i.h>,參數以<*value, size>的形式傳遞,當填充fuse_req結構時,根據請求類型,以及請求參數,設定fuse_in的參數個數(numargs),並將參數填充到args數組中,同時設定fuse_out輸出參數的個數,並將存放輸出結果的地址(局部變數outarg)填充到args數組中。

 

當fuse檔案系統設定好請求輸入輸出參數之後,所有介面最後都會調用fuse_request_send將代表本次請求的fuse_req結構的狀態標誌設定為FUSE_REQ_PENDING,將請求加到fuse_conn的pending鏈表中,並調用request_wait_answer等待請求完成(等待隊列被喚醒後,需要檢查請求狀態是否為FUSE_REQ_FINISHED)。當本次請求被響應後,結果已經被存放在局部變數outarg中,fuse進行相應的處理即可向上層返回結果。

 

每個請求fuse_req結構中包含一個wait_queue_head_t的waitq欄位,每個請求在被發出之後,它首先會喚醒fuse_conn的waitq等待隊列,告訴使用者態守護進程有請求達到;然後其會調用wait_event_interruptible在req的waitq上睡眠等待FUSE_REQ_FINISHED條件變為真。

 

fuse裝置驅動是一個簡單塊裝置驅動程式,用於fuse在使用者態和核心態之間交換資料,fuse包含一個使用者空間的精靈,其一直迴圈運行,主要任務是調用read從fuse裝置上讀取請求,當沒有請求時,它會在fuse_conn的waitq上睡眠等待(對應上一段中請求發出後喚醒fuse_conn的waitq等待隊列),當有請求是其從fuse_conn的pengding隊列中取出最前的一個請求(對應上一段中請求發出後加到fuse_conn的pending鏈表),並將該請求移動到processing隊列中,守護進程將fuse_req的相關資訊讀到使用者態後,根據請求表示調用使用者態實現的回呼函數,並將結果通過fuse_dev_write寫到fuse裝置驅動,使用者態請求完成後,從processing隊列中找到對應的fuse_req,將結果拷貝到fuse_req的out參數中,並將fuse_req的state設定為FUSE_REQ_FINISHED,然後喚醒fuse_req的waitq。此時,fuse_req被處理完畢,fuse檔案系統向上層返回。

 

更多關於fuse的知識,請參見我的部落格fuse專欄:

http://blog168.chinaunix.net/space.php?uid=20196318&do=blog&frmd=1570&view=me

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.