Linuxで書き込みが失われる原因となるI / Oエラーに対処するプログラムを作成する
TL; DR:LinuxカーネルがバッファリングされたI / O書き込みを失った場合、アプリケーションがそれを見つける方法はありますか? fsync()耐久性のためにファイル(およびその親ディレクトリ)を使用する必要があることを知っています。問題は、I / Oエラーが原因で書き込み保留中のダーティバッファーがカーネルで失われた場合、アプリケーションはこれをどのように検出して回復または中止できるでしょうか。 書き込みの順序と書き込みの持続性が重要になるデータベースアプリケーションなどを考えてください。 書き込みを忘れましたか?どうやって? Linuxカーネルのブロックレイヤーは、状況によっては、などによって正常に送信されたバッファリングされたI / O要求を失う可能性があり、次のようなエラーが発生します。write()pwrite() Buffer I/O error on device dm-0, logical block 12345 lost page write due to I/O error on dm-0 (end_buffer_write_sync(...)およびend_buffer_async_write(...)をfs/buffer.c参照)。 新しいカーネルでは、エラーには代わりに「失われた非同期ページ書き込み」が含まれます。 Buffer I/O error on dev dm-0, logical block 12345, lost async page write アプリケーションwrite()は既にエラーなしで返されているので、アプリケーションにエラーを報告する方法はないようです。 それらを検出しますか? 私はカーネルソースにそれほど精通していませんが、非同期書き込みを行っている場合、書き出されなかったバッファーに設定されると思いますAS_EIO。 set_bit(AS_EIO, &page->mapping->flags); …