Linux內核追蹤[4.13] Blk層的出錯處理優化

        之前的版本在IO軟件棧中存在着錯誤信息不能很好地返回FS層或者用戶態APP的情況,4.13版本優化了兩個場景的錯誤處理。(參考: https://lwn.net/Articles/724307/)

一、Reporting writeback errors
        一個場景和異步寫相關。之前的版本,由後臺線程進行writeback出錯時,只能通過提交write的那個task進行fsync才能檢測到後臺writeback的錯誤,其它task進行fcync是無法檢測這個錯誤的,新版本任何進程的task對該文件執行fsync都會獲得錯誤的信息。
       新的版本在address_space對象中引入了一個errseq_t的成員對象,包含了錯誤信息和序列號。在page cache被writeback時是可以被訪問到的。同時address_space對象是文件級別的,因此所有的進程在writeback失敗後的fsync返回時都可以獲取到該信息。另外在每個進程私有的file結構體中引入一個f_wb_err成員來保留上次errseq_t中的序列號,調用fsync時如果發現兩個對象中的序列號不同時,則是出現了新的writeback錯誤,則返回錯誤信息。
        low-level文件系統層也需要做響應處理,當時只修改了ext4和ext2。

二、Block-layer error codes
       lock-layer error codesdriver層的報錯相關,之前BIO和driver層出錯,很多情況只能往上報一個EIO(I/O error),FS層和user-level只能不知道確切的原因,運維人員通常只能通過dmesg的內容才能知道這個事件。
       新版本引入了一個blk_status_t類型(其實就是u8類型),保存blk層發生的具體錯誤碼,這個錯誤碼與Linux內核的標準錯誤碼一一的對應關係(比如BLK_STS_TIMEOUT對應到ETIMEDOUT)。暫時4.13沒有引入新的內核層的錯誤碼,後續有可能。另外將bio對象的bi_error成員重命名爲了blk_status_t類型的成員,後續在block層需要判斷錯誤時都使用這個新成員,需要往上層返回真實內核錯誤碼時通過對應關係轉換後(新增的blk_status_to_errno函數)進行返回。

(參考代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章