Назад к блогу

Ядро Linux 7.3-rc7: ext4 объявляет data=journal устаревшим

Ядро Linux 7.3-rc7: ext4 объявляет data=journal устаревшим

В очередном релиз-кандидате ядра Linux наметилась важная веха в развитии файловой системы ext4: режим монтирования data=journal официально признан устаревшим и будет удалён в начале 2028 года. Разбираем, какие механизмы затрагивает это решение и как теперь выбирается способ журналирования данных для отдельных inode.

12 октября 2026 года вышел релиз-кандидат ядра Linux 7.3-rc7. Линус Торвальдс отметил, что предпочёл бы видеть меньший rc, но ничто в нём не выглядит причиной откладывать финальный релиз — он по-прежнему запланирован на следующие выходные, если не появится что-то новое. Среди изменений, попавших в основную ветку на той же неделе, — объявление устаревшим режима монтирования ext4 data=journal. Режим будет полностью удалён в начале 2028 года.

Что именно изменилось

Опция data=journal не удалена и не помечена как недопустимая. При монтировании с ней ядро печатает предупреждение о том, что режим устарел и поддержка будет удалена в январе 2028 года, после чего монтирование продолжается. Режим по-прежнему распознаётся как отдельное значение: при монтировании ext4 проверяется, что выбран именно режим журналирования данных, и для него выполняется ряд действий.

Опция data задана как перечисление параметров монтирования, и в таблице опций присутствует запись {Opt_data, 0, MOPT_NO_EXT2} — то есть она принимается и обрабатывается, а не помечена как удалённая.

Что происходит при монтировании с data=journal

При монтировании файловой системы ext4 с опцией data=journal ядро выполняет следующее:

  • печатает предупреждение об устаревании и однократное предупреждение о том, что режим отключает отложенное выделение, dioread_nolock, O_DIRECT и fast_commit;
  • отключает dioread_nolock — dioread_nolock;
  • отключает fast_commit — fast_commit;
  • отказывает в монтировании, если одновременно включены EXPLICIT_DELALLOC или DAX_ALWAYS;
  • при наличии шифрования выводит предупреждение, что шифрованные файлы будут использовать data=ordered;
  • отключает отложенное выделение (DELALLOC), если оно установлено.

Также при data=journal максимальный порядок фолио устанавливается равным минимальному.

Если режим не data=journal, функция устанавливает флаг SB_I_CGROUPWB в sb->s_iflags.

Как устроен режим журналирования данных

В режиме data=journal для inode устанавливается набор операций адресного пространства ext4_journalled_aops, в котором write_end = ext4_journalled_write_end и dirty_folio = ext4_journalled_dirty_folio.

ext4_journalled_dirty_folio при попытке пометить страницу грязной не делает буферы грязными, а при наличии pin-а помечает folio как checked, после чего вызывается filemap_dirty_folio. ext4_journalled_write_end при частичной записи вызывает ext4_journalled_zero_new_buffers, который для новых буферов обнуляет диапазон и вызывает write_end_fn, а не помечает буферы грязными. Для уже записанных буферов ext4_journalled_write_end проходит по буферам через ext4_walk_page_buffers с write_end_fn, а затем обновляет i_datasync_tid.

ext4_journal_folio_buffers сначала получает доступ на запись к буферам через do_journal_get_write_access, затем вызывает write_end_fn, после чего добавляет inode в журнал через ext4_jbd2_inode_add_write и также обновляет i_datasync_tid.

Как выбирается режим для конкретного inode

Для каждого inode система определяет, как именно будут журналироваться его данные. Если журнал у файловой системы отсутствует, данные пишутся в режиме отложенной записи — writeback. Если inode не является обычным файлом, помечен флагом EXT4_INODE_EA_INODE, либо при монтировании выбрана опция DATA_FLAGS со значением EXT4_MOUNT_JOURNAL_DATA, либо у inode установлен флаг EXT4_INODE_JOURNAL_DATA и не включён DELALLOC — данные пишутся в режиме полного журналирования, journal data. Исключение — зашифрованный обычный файл: для него выбирается ordered. В остальных случаях режим определяется опцией монтирования: при DATA_FLAGS со значением EXT4_MOUNT_ORDERED_DATA используется ordered, при EXT4_MOUNT_WRITEBACK_DATA — writeback.

Как выбирается режим по умолчанию

При загрузке журнала ext4_load_and_init_journal, если режим данных не задан (test_opt(sb, DATA_FLAGS) == 0), выбирается ORDERED_DATA, если журнал поддерживает JBD2_FEATURE_INCOMPAT_REVOKE, иначе JOURNAL_DATA.

Функция ext4_has_journal_option возвращает строку с именем опции журнала, которая отличается от значения по умолчанию: она проверяет JOURNAL_ASYNC_COMMIT, EXPLICIT_JOURNAL_CHECKSUM, s_commit_interval, DATA_FLAGS и DATA_ERR_ABORT, возвращая соответствующее имя или NULL.

Ограничения совместимости

Режим data=journal несовместим с dioread_nolock — ядро не отклоняет монтирование, а молча отключает dioread_nolock. Дополнительно снимается JOURNAL_FAST_COMMIT и, если задан DELALLOC, снимается DELALLOC. При явном EXPLICIT_DELALLOC или DAX_ALWAYS монтирование отклоняется с -EINVAL.

Также data=ordered несовместим с journal_async_commit — монтирование с обоими опциями завершается ошибкой.

Альтернативные режимы

Вместо data=journal применяются режимы data=ordered и data=writeback, которые выбираются через опцию монтирования data и проверяются в ext4_inode_journal_mode. Для шифрованных обычных файлов при data=journal фактически используется ordered-режим.

Механизм jbd2 представлен fast commit. Быстрая фиксация запускается, только если уже была хотя бы одна полная фиксация; при её запуске, завершении и откате к полной фиксации система переходит между ускоренным и обычным режимами фиксации журнала.

Что можно будет удалить после отказа от режима

После отказа от data=journal можно удалить или упростить несколько journalled-специфичных путей. В super.c функция ext4_journalled_submit_inode_data_buffers и её помощник ext4_journalled_writepage_needs_redirty существуют только для режима журналирования данных: они переотмечают грязные фолио при writeback. Функция ext4_journal_submit_inode_data_buffers выбирает между journalled- и normal-ветками через ext4_should_journal_data, а ext4_journal_finish_inode_data_buffers вызывает jbd2_journal_finish_inode_data_buffers только когда режим не journalled — обе можно свести к прямым вызовам.

В ext4_check_journal_data_mode вся ветка для EXT4_MOUNT_JOURNAL_DATA станет ненужной. В ext4_set_max_mapping_order выбор sbi->s_max_folio_order = sbi->s_min_folio_order делается только для EXT4_MOUNT_JOURNAL_DATA.

В inode.c можно удалить ext4_dirty_journalled_data, ext4_journalled_zero_new_buffers, ext4_journalled_write_end, ext4_journalled_dirty_folio и таблицу ext4_journalled_aops, а в ext4_set_aops — ветку EXT4_INODE_JOURNAL_DATA_MODE, назначающую ext4_journalled_aops. Также в ext4_block_write_begin проверки should_journal_data и вызовы do_journal_get_write_access/ext4_journalled_zero_new_buffers станут лишними.

Сроки и версии

Релиз-кандидат 7.3-rc7 опубликован 12 октября 2026 года. Финальный релиз запланирован на следующие выходные. Режим data=journal будет полностью удалён в начале 2028 года.

Ограничения и открытые вопросы

Авторы признают, что режим data=journal устарел и будет удалён. Этот режим отключает отложенное выделение, dioread_nolock, O_DIRECT и fast_commit, а также несовместим с delalloc и dax — монтирование с обоими опциями завершается ошибкой. Для шифрованных файлов data=journal не применяется — вместо него используется data=ordered.

Источники

Похожее