В виду последних событий, когда многие люди обнаружили пропадание и обнуление файлов в файловой системе ext4 после краха ОС, создатели ext4 высказались за идею включения в ядро новых системных вызовов, которые бы позволили безопасно работать с файлами.
Линус Торвальдс в списке рассылки ядра жестоко раскритиковал эти предложения и заявил, что большинство программистов никогда не будут этими новыми системными вызовами пользоваться, что они будут не стабильными и плохо оттестированными.
Цитата: "Поэтому вместо того, чтобы придумывать новые препятствия, которые никто не будет использовать, разработчики файловых систем должны нацеливаться на плохой "лишь бы работал" код, до тех пор пока не случилась самое большое несчастье. Потому что, хотите вы этого или нет, 99% программ именно так и написаны.
Неоспоримый ФАКТ того, что люди не проверяют ошибки, которые возвращает системный вызов close() (закрытие файла и сброс "грязных" данных из кэша на диск) должен означать, что, например, при отложенной записи на диск нужно обязательно проверять ситуацию переполнения диска. Если ваша файловая система возвращает результат ENOSPC при закрытии файла, вы просто теряете покрытие ошибкой состояния нехватки места для 90% приложений. Вот так всё просто.
Жаловаться на то, что это ошибка в приложении, это всё равно что жаловаться на скорость света: вы должны решать это проблему имея прямое отношение к реалиям мира, а не так, как вам кажется, эти реалии должны быть. Тоже самое относится к "люди должны писать во временный файл, вызывать метод fsync для него и переименовывать его вместо оригинала". Вы думаете, что так должно быть, но в реалии программисты пишут open(filename, O_TRUNC | O_CREAT, 0666). Жёсто <и не правильно>, я знаю. Но в конечном итоге, даже разработчики хорошо написанного приложения могут решать что fsync() не стоит тех потерей в производительности. В git, например, где мы пытаемся быть очень очень очень (sic!) аккуратными, fsync() по умолчанию выключен.
Почему? Потому что его включение вызывает неприемлемое поведение ext3. Сейчас, надо сказать, дизайн git'a означает, что потерянная новая база данных не является мёртвой, но потенциально это очень очень беспокоит и смущает - вам, возможно, придётся откатить назад и переделать некоторые операции вручную, и вы должны достаточно знать изначально, чтобы сделать это.
Так о чём я говорю? Иногда те разработчики файловых систем, которые говорят "вы должны использовать fsync(), чтобы получить предсказуемые результаты" - это те же люди, которые испортили всё это до такого безобразия, что fsync'ом абсолютно нереалистично пользоваться.
Теория и практика иногда сталкиваются. Когда это случается, теория проигрывает. Всегда."