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