Linux核心追蹤[4.13] Blk層的出錯處理優化
阿新 • • 發佈:2018-12-16
之前的版本在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。
(參考程式碼: https://lwn.net/Articles/724232/)
二、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函式)進行返回。
(參考程式碼 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=2a842acab109f40f0d7d10b38e9ca88390628996 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4e4cbee93d56137ebff722be022cae5f70ef84fb)
一、Reporting writeback errors 一個場景和非同步寫相關。之前的版本,由後臺執行緒進行writeback出錯時,只能通過提交write的那個task進行fsync才能檢測到後臺writeback的錯誤,其它task進行fcync是無法檢測這個錯誤的,新版本任何程序的task對該檔案執行fsync都會獲得錯誤的資訊。
二、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函式)進行返回。
(參考程式碼 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=2a842acab109f40f0d7d10b38e9ca88390628996 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4e4cbee93d56137ebff722be022cae5f70ef84fb)