EROFS отключает потоковую распаковку LZ4 из-за риска повреждения данных

· Linux и open source
Разработчики файловой системы EROFS временно убрали оптимизацию rolling decompression для LZ4: в редких случаях она приводила к порче данных. Изменение попадёт в ядро Linux 7.3.

Файловая система только для чтения EROFS, широко применяемая во встраиваемых системах, контейнерах и других сценариях, в середине цикла разработки была вынуждена временно отключить механизм потоковой распаковки (rolling decompression) для алгоритма LZ4. Соответствующее изменение вошло в подготовку к выпуску ядра Linux 7.3-rc3.

В чём проблема

Поводом стало сообщение инженеров AWS: на их системах в редких, специфических наборах данных LZ4 обнаружилось повреждение данных. Углублённый анализ показал корень проблемы — в текущей реализации LZ4 возможны неконтролируемые обратные копирования в памяти, которые нарушают допущение, лежащее в основе оптимизации rolling decompression. При копировании длинных литералов функция memmove() на x86 может копировать данные «назад», ориентируясь на сравнение адресов, даже когда исходный и целевой диапазоны не перекрываются. Это ломает предположение о скользящем окне.

Поскольку кодовая база LZ4 в ядре находится вне контроля EROFS, разработчики решили не рисковать корректностью данных в реальной эксплуатации и отключить оптимизацию, пока не будет продуман дальнейший план.

Как работала оптимизация

Потоковая распаковка была введена, чтобы снизить расход временной памяти. LZ4 основан на LZ77 и обращается лишь к последним 64 КиБ уже распакованных данных, поэтому теоретически достаточно ограниченного скользящего окна временных страниц. Экономия ощутима: например, 601 960 байт могут быть сжаты в LZ4-экстент размером 256 КиБ, и без rolling decompression в худшем случае потребовалось бы 146 дополнительных страниц на запрос.

Последствия

Основной эффект отключения — возросший расход оперативной памяти во время работы. Частично его смягчает недавно добавленный резервный пул буферов для распаковки LZ4, однако и это решение неидеально.

Разработчики подчёркивают, что EROFS сегодня используется повсеместно, поэтому приоритет — корректность данных. Механизм скользящего окна можно будет вернуть позже: либо если официальный код LZ4 гарантированно начнёт копировать непересекающиеся диапазоны только «вперёд», либо если EROFS обзаведётся собственной реализацией LZ4. Пока же, начиная с Linux 7.3, потоковая распаковка LZ4 в EROFS отключена.


Источник: Phoronix

Комментарии

Войдите, чтобы комментировать.

  • Пока нет комментариев.