Правильно ли воспринимать fsync() как «барьер» файловой системы, а не столько как гарантию какой-либо записи?
Развёрнутый вопрос:
Если я сделал пару write() по 100 МБ каждый, то к какому реальному физическому порядку записи секторов на диск это приведёт гарантий никаких нет: нельзя утверждать, что если записался последний байт из этих 200МБ, то записалось и всё остальное: файловая система вольна переупорядочивать пищущие обращения к диску, повышая свою производительность.
Потому в разных областях говнокодинга существует такое понятие как барьер. Есть барьеры памяти - всякие там std::memory_order в C++, например. И есть барьеры в файловой системе.
Является ли таким барьером fsync()? То есть, можно ли утверждать, что если я вижу записанным сектор «B», который уходил в ФС через write() после вызова fsync(), то всё что ушло в ФС через write() ДО этого вызова fsync() записалось стопудняк?
То есть, гарантируется ли отсутствие переупорядочения записей между двумя моментами времени, разделёнными fsync() ?
Иными словами:
int f = open(...);
// пускай физические операции записи всех секторов, составляющие запись этих 100МБ, будут переупорядочены
write(f, buff, 1024*1024*100);
fsync();
// делаем запись не жирнее 1 сектора, чтобы в ней самой нечего было переупорядочивать
write(f, buff2, 4096);
// есть тут fsync() или нет - пофиг.
//fsync();
close();
Можно ли утверждать, что если после вышеприведённого кода я вижу на диске buff2 в том месте куда его записывали, то значит все 100MB buff точно дошли до диска? (при условии абсолютной исправности диска, дров, кода ядра).
Если нет, то почему. Напоминаю: вопрос не на тему гарантий записи, а на тему барьера.