Вот типичный и хорошо -известный подход для атомарных обновлений файлов:
fd = open(“foo.new”, O_WRONLY);
write(fd, buf, bufsize);
fsync(fd);
close(fd);
rename(“foo.new”, “foo”);
В общем, если нам также нужна долговечность (т.е. гарантия того, что новая версия файла будет доступна в случае сбоя), то нам также нужно вызывать fsync
в родительском каталоге.
Вопрос: Это тоже нужно для UBIFS? В документации говорится:
fsync() может вызываться для каталогов — он синхронизирует метаданные inode каталога. [...]
Вызов fdatasync() для каталогов в UBIFS является «неоперативным», и все операции UBIFS, которые изменяют записи каталога, являются синхронными.
Если я правильно читаю, последнее («все операции UBIFS, которые изменяют записи каталога, являются синхронными»), по-видимому, подразумевает, что вызов fsync
в родительском каталоге не требуется. Однако мои тесты, кажется, указывают на обратное. Я неправильно читаю документы, или эта информация устарела?