EROFS отключает потоковую распаковку LZ4 из-за риска повреждения данных
Файловая система только для чтения 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
Комментарии
Войдите, чтобы комментировать.