Работает ли fsync(fd) с файлом, созданным внешней программой?

У меня есть жесткий диск SATA с отключенным кэшем записи:

hdparm -W0 /dev/foo

Я работаю на ext4 раздел с этими параметрами монтирования (среди прочих):

data=ordered
auto_da_alloc

Версия ядра Linux 2.6.32-5-686,

Теперь у меня есть внешняя программа, которую я не могу изменить, но я знаю, что создает файл следующим образом:

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

Т.е. это не fsync перед закрытием. Поэтому на данный момент данные, вероятно, находятся в оперативной памяти, где-то в кешах ядра / fs.

Примечание: метаданные пока не имеют значения: окончательные метаданные будут записаны и синхронизированы после того, как я убедился, что данные дошли до дисков. Данные сами по себе являются проблемой.

Итак, вопрос в том, как я могу помочь данным достичь фактических дисковых пластин?

Я думал о запуске этой отдельной программы впоследствии:

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

Поможет ли это сбросить данные или я должен использовать другой подход?

2 ответа

Решение

Поможет ли это сбросить данные,

Да, не имеет значения, кто выполняет fsync.

Обратите внимание, что вы, вероятно, хотите синхронизировать каталог, в котором находится файл, для синхронизации метаданных файла.

От 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.
Другие вопросы по тегам