- Ganz oben sitzen die Puffer der Standardlibrary (libc). Die meisten üblichen Befehle der Bash nutzen die, um Datenströme ökonomisch zusammenzusetzen, z.B. Bildschirmausgabe über echo, Kopieren/Übertragen mit cp/dd oder in selbst geschriebenen C-Programmen die Benutzung von Befehlen wie printf.
- Darunter (immer noch in der libc) existieren Lowlevel-Befehle, wie z.B. write(). Wenn die Puffer von Punkt 1 voll sind, oder geleert werden (z.B. durch den Befehl sync) tritt diese Ebene in Kraft. Sie übergibt dann das Auszugende an eine entsprechende Kernelfunktion.
- Im Kernel sitzen wiederum Puffer, um die Hardwarezugriffe zu optimieren. Diese sind es auch, welche man mit O_DIRECT überspringen kann, was sich einfache Programme aber meist nicht antun wollen.
- Darunter schließlich gibt es je nach Gerät die Hardwarepufferung durch den Controller/die Hardware. Das ist der Puffer, den Du in Deinem Post angesprochen wird. Der lässt sich mit O_DIRECT gar nicht beeinflussen. Ob und wie das überhaupt möglich, hängt von der Hardware ab. Dafür gibt es dann spezielle Befehle namens ioctl (Input/Output Control). Von dieser Art der Pufferung war aber in dem Bug-Report nicht die Rede. Der drehte sich nur um die in Punkt 2 genannte Ebene.
Und jetzt muss ich ein wenig spekulieren: HMB (host memory buffer) klemmt sich zwischen die Ebenen 3 und 4 und standardisiert das Schreiben auf einem NVMe-Gerät, das über die PCIe-Lanes angeschlossen ist. Meiner Meinung nach spielt daher O_DIRECT hier keine Rolle.