O_DIRECT (since Linux 2.4.10)
Try to minimize cache effects of the I/O to and from this
file. In general this will degrade performance, but it is
useful in special situations, such as when applications do
their own caching. File I/O is done directly to/from user-
space buffers. The O_DIRECT flag on its own makes an effort
to transfer data synchronously, but does not give the
guarantees of the O_SYNC flag that data and necessary metadata
are transferred. To guarantee synchronous I/O, O_SYNC must be
used in addition to O_DIRECT. See NOTES below for further
discussion.
Na seção NOTES:
O_DIRECT support was added under Linux in kernel version 2.4.10.
Older Linux kernels simply ignore this flag. Some filesystems may
not implement the flag and open() will fail with EINVAL if it is
used.
Então O_DIRECT costumava ser simplesmente ignorado. E do LKML , há alguns meses:
Who cares how a filesystem implements O_DIRECT as long as it does not corrupt data? ext3 fell back to buffered IO in many situations, yet the only complaints about that were performance. IOWs, it's long been true that if the user cares about O_DIRECT performance then they have to be careful about their choice of filesystem.
But if it's only 5 lines of code per filesystem to support O_DIRECT correctly via buffered IO, then exactly why should userspace have to jump through hoops to explicitly handle open(O_DIRECT) failure?
Especially when you consider that all they can do is fall back to buffered IO themselves....
Eu escrevi contrapontos para tudo isso, mas achei melhor isto. Versões antigas do kernel simplesmente ignoram O_DIRECT, tão claramente há precedente.
Dado que, parece que você está seguro simplesmente ignorá-lo. A frase chave parece ser "não corromper dados".
Por enquanto.
Note também que sua pergunta vinculada tem respostas que dizem O_DIRECT não é útil por motivos de desempenho. Isso é simplesmente incorreto. Passar dados através do cache da página é mais lento do que não passando através do cache da página. Isso pode ser significativo em hardware capaz de transferir gigabytes por segundo. E se você manejar apenas cada bit de dados uma vez, o cache é literalmente inútil, mas afetará desnecessariamente todo o sistema.
Faz alguns anos que eu escrevi um módulo de sistema de arquivos Linux. Infelizmente, não me lembro de como os sistemas VFS lidam com o armazenamento em cache.