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