2015-03-10 20 views
5

Ich habe eine SATA-Festplatte mit Schreib-Cache deaktiviert:Funktioniert fsync (fd) in einer Datei, die von einem externen Programm erstellt wurde?

hdparm -W0 /dev/foo 

ich mit diesem Mount-Optionen (unter anderem) auf einer ext4 Partition am Betrieb:

data=ordered 
auto_da_alloc 

Linux-Kernel-Version ist 2.6.32-5-686.

Jetzt habe ich ein externes Programm, das ich nicht ändern kann, aber dass ich weiß, erstellt eine Datei auf folgende Weise:

int fd = open(path); 
write(fd, data, data_size); 
close(fd); 

D.h. Es fsync nicht vor dem Schließen. Zu diesem Zeitpunkt befinden sich die Daten möglicherweise im RAM, irgendwo in kernel/fs-Caches.

Hinweis: die Metadaten sind noch kein Problem: die endgültigen Metadaten werden geschrieben und fuzzed nach Ich habe sichergestellt, dass die Daten die Disk-Platten erreicht hat. Die Daten selbst sind das Problem.

Die Frage ist also, wie kann ich helfen, die Daten erreichen die tatsächlichen Platten Platten? danach dieses separates Programm laufen dachte

Ich habe:

int fd = open(path); 
fsync(fd); 
close(fd); 

Wird das helfen, die Daten zu spülen, oder sollte ich einen anderen Ansatz?

Antwort

1

Wird das helfen bündig die Daten,

Ja, es wird, es ist egal, wer die fsync tut.

Beachten Sie, dass Sie wahrscheinlich auch das Verzeichnis synchronisieren möchten, in dem sich die Datei befindet, um die Metadaten der Datei zu synchronisieren.

0

Von man fsync:

Calling fsync() does not necessarily ensure that the entry in the 
directory containing the file has also reached disk. For that an 
explicit fsync() on a file descriptor for the directory is also 
needed.