编写程序以应对导致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); …