使用O_DIRECT写入时,是否需要使无效caching读取?

我遇到了使用LVM和我正在使用的磁盘驱动程序的竞争条件。 它看起来像vgcreate和lvcreate在O_DIRECT模式下做他们的IO。 我用-vvv运行这些命令时发现了这个问题。

Clearing start of logical volume "test" /dev/Finance-PG-vg/test: Added to device cache Opened /dev/Finance-PG-vg/test RW O_DIRECT Wiping /dev/Finance-PG-vg/test at sector 0 length 8 sectors /dev/Finance-PG-vg/test: block size is 4096 bytes Closed /dev/Finance-PG-vg/test 

具体来说,我怀疑我们的读取正在caching,并没有得到最新的磁盘内容。

如果用O_DIRECT写入内容,我的理解是绕过caching。 因此,对该扇区的任何读取都将从caching中接收旧数据,至less在caching失效之前。 所以如果我想读几秒钟内写的O_DIRECT,我应该先放下caching?

正确?

这里有几个困惑:

  • 您提到的工具很可能使用O_DIRECT来确保新的LVM配置是持久的。 LVM元数据实际上存储在您提供的所有物理磁盘/分区上的特定位置。

  • 写入LVM设备默认情况下不使用O_DIRECT(尽管打开文件时可以传递此标志)。

  • 用O_DIRECT绕过缓存并不意味着你得到陈旧的数据。 让我们假设你打开一个文件,写入文件,关闭它,然后用O_DIRECT再次打开它,然后读取文件。 读取保证将最新的更改返回到文件。 没有过时的数据返回。 使用O_DIRECT时不需要删除缓存。