Re O_SYNC e O_DIRECT, eles não são os mesmos:
- O_SYNC causa sincronizações de disco, mas as coisas vão nos caches, então você leu o cache
- O_DIRECT ignora os caches, mas não sincroniza
- No caso de (por exemplo) raid, o AFAIK O_DIRECT poderia resultar em coisas enviadas para raid mas não inferiores a
- O_SYNC provavelmente resultará em sincronizações de disco completas, o que fará com que os dados de outras partições e outros arquivos sejam sincronizados e também liberará os caches de hardware
Re-bloqueio, sim e não:
- Se o sistema de arquivos não for montado com sincronização, ele retornará, desde que os dados tenham sido copiados para o kernel. Contanto que haja espaço livre no buffer no kernel, ele será instantâneo. Quando não houver mais espaço no buffer, ele será bloqueado até que haja.
- Se o sistema de arquivos for montado com sincronização, ele bloqueará
Abra novamente, em man 2 open
:
O_SYNC Write operations on the file will complete according to the
requirements of synchronized I/O file integrity completion (by
contrast with the synchronized I/O data integrity completion
provided by O_DSYNC.)
Veja a página de manual para mais informações sobre isso.