Как ext4 работает с fallocate

Недавно я тестирую правильное использование файловой системы ext4. что мой эксперт таков:

когда система потерпела крах, данные были записаны, возвращение нормально не может быть потеряно, но метадат может.
Вот мое использование:
1. Вызовите fallocate, чтобы выделить centain space fallocate (fd, 0, 0, 4 * 1024 * 1024); // 4MB
2. вызвать fsync(fd), чтобы данные и метаданные записывались на диски
3. Затем я вызываю функцию для случайной записи файла размером 4 КБ (случайные данные, но не 0). с флагом O_DRICT ,, но не вызывать fsync. Я записываю смещение с возвратом напиши ок.
4. проверьте смещение, которое зарегистрировано. но я нахожу в некотором смещении, считываем данные 4k, равное 0. Кажется, это означает, что смещение не используется как файлы отверстий.

Мой вопрос таков:
<1. почему после вызова fallocate и fsync метаданные файла все еще указывают на то, что некоторые блоки не используются, поэтому при чтении возвращается значение null. Это мое понимание.
<2. есть другие api для вызова, может убедиться, что в выделенном пространстве с файлом нет дыр, после этого, когда запись данных возвращается нормально, O_DIRECT может убедиться, что данные не будут потеряны, даже если система выйдет из строя.

Thanks.

1 ответ

Только запись в файловое пространство может устранить дыру. Без записи нет грязной страницы, а fsync просто ничего не делает.

Мне интересно, как вы выполнили шаг 4. Кажется, вы сделали это вручную, не так ли? Если вы читаете его после записи без сбоя, он не должен быть нулевым, если вы написали не нули. Если вы прочитаете его после сбоя, ноль может произойти, если существует кэш диска. Однако этот вид нуля не похож на дыры, это нули, считанные с диска (очень вероятно, что диск содержит нули).

Другие вопросы по тегам