Linux块设备驱动程序请求排序 - RaW?

hli*_*itz 6 c linux block-device

我正在编写一个Linux块设备驱动程序,它通过注册的函数接收请求blk_init_queue().

我的硬件设备重新排序请求,因此为了避免写后读写冲突,需要等待write(lba x)发出之前完成read(lba x).

我的问题:请问在Linux块层跟踪原料的冲突,它会不会发出read(lba x)直到收到一个请求完成(通过__blk_end_request_all(req r))的前面write(lba x),或做我必须做的是,在我的司机?

hli*_*itz 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 要求之外没有任何排序约束(之前完成的 WRITE 应在 FLUSH 完成时位于介质上)。

  • 写数据,REQ_FLUSH - FLUSH 必须在写数据发出之前完成。IE。在之前的所有写入都写入介质之前,不得将写入数据写入介质。

  • 写入数据,REQ_FUA - 写入应在发出 FLUSH 之前完成 - 即。写入数据应与之前完成的生物写入完成一起放在盘片上。

  • 写入数据,REQ_FLUSH | REQ_FUA - 在所有之前的写入都写入介质之前,不得将写入数据写入介质 && 写入数据必须在 Bio 完成时写入介质。这通常按 FLUSH 写入 FLUSH 的顺序排序。

[来自 linux-fsdevel 邮件列表:http://www.spinics.net/lists/linux-fsdevel/msg45616.html]