2016-04-15 51 views
6

我正在寫一個Linux塊設備驅動程序,它通過一個註冊爲blk_init_queue()的函數接收請求。Linux塊設備驅動程序請求排序 - RaW?

我的硬件設備對請求進行重新排序,因此避免了寫後衝突衝突,因此需要在發出read(lba x)之前等待write(lba x)的完成。

我的問題:請問在Linux塊層跟蹤原料的衝突,它會問題read(lba x)直到收到一個請求完成(通過__blk_end_request_all(req r))爲前面的write(lba x),或做我必須做的,在我的驅動程序?

回答

0

根據以下文章,Linux塊設備驅動程序現在可以自由地重新排序請求,文件系統層負責避免危害和實施障礙。 https://lwn.net/Articles/400541/

唯一的例外是實現回寫緩存的設備的REQ_FLUSH和REQ_FUA請求。在設置這些標誌的情況下,某些訂購要求需要由blk設備驅動程序執行。 https://www.kernel.org/doc/Documentation/block/writeback_cache_control.txt

特別是以下順序要求存在:

  • 沒有寫入數據,REQ_FLUSH - 沒有任何順序約束 比內在FLUSH要求(以前完成寫入 應該是對等媒體在FLUSH上完成)。

  • 寫入數據REQ_FLUSH-FLUSH必須在寫入數據爲 之前完成。即。寫入的數據不能寫入媒體之前,所有先前的寫入都在媒體上。

  • 寫入數據REQ_FUA - 寫入FLUSH之前應完成 發佈 - 即。寫入數據應該與之前的 已完成的生物完成寫入一起放在盤片上。

  • 寫數據,REQ_FLUSH | REQ_FUA - 寫入數據不能寫入 媒體之前所有先前的寫入都在媒體上& &寫入 數據必須在生物完成時位於媒體上。這通常是 的順序爲FLUSH寫入FLUSH。

[從Linux-fsdevel郵件列表:http://www.spinics.net/lists/linux-fsdevel/msg45616.html]

相關問題