Нужно ли синхронизировать родительский каталог в 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 является «неоперативным», и все операции UBIFS, которые изменяют записи каталога, являются синхронными.

Если я правильно читаю, последнее («все операции UBIFS, которые изменяют записи каталога, являются синхронными»), по-видимому, подразумевает, что вызов fsync в родительском каталоге не требуется. Однако мои тесты, кажется, указывают на обратное. Я неправильно читаю документы, или эта информация устарела?


person Grodriguez    schedule 10.12.2018    source источник
comment
Док сбивает с толку. fdatasync обычно выполняется для файла, а не для каталога fds. Функция ubifs_fsync() в коде кажется идентичной для операций с файлами и каталогами. Возможно, вам следует спросить в их списке рассылки.   -  person itisravi    schedule 10.12.2018
comment
Похоже, вы получили ответ :) lists.infradead.org/ pipermail/linux-mtd/2018-декабрь/   -  person itisravi    schedule 11.12.2018
comment
Конечно. Так что похоже, что документы вводят в заблуждение в этом случае...   -  person Grodriguez    schedule 11.12.2018


Ответы (1)


Я спросил в списке рассылки MTD; кажется, что документация неоднозначна, и что вызов fsync на родительском dir необходим, как и в других файловых системах.

person Grodriguez    schedule 11.12.2018