Суть проблемы: почему данные исчезали бесследно
В ходе окна слияния Linux 7.2 разработчики удалили механизм исправления Copy-On-Write (COW), полагая, что подсистема управления памятью ядра уже решает соответствующие условия. Однако на практике это привело к серьезному регрессу: без данного механизма возникала ситуация, когда страницы помечались как измененные (dirty), но файловая система не имела об этом информации. Результатом стала тихая потеря данных — файлы повреждались или исчезали без предупреждения.
Решение: возвращение инфраструктуры Fixup Worker
David Sterba из SUSE отправил запрос на включение изменений, восстанавливающих инфраструктуру fixup worker. Это механизм, который обнаруживает страницы (folios), помеченные как измененные без ведома файловой системы, и выполняет необходимую коррекцию. Несмотря на масштабность изменений (восстановлено более 600 строк кода), Linus Torvalds одобрил пулл-реквест, и исправление уже доступно в ветке Linux 7.2-rc7.
Технические детали обновления
Восстановленный код не просто копирует старую реализацию, а адаптирован под современные API. Оригинальный механизм работал только со страницами (pages), тогда как новая версия поддерживает API folio и подстраничные размеры блоков. Половина кода отведена под отладочные инструменты и вспомогательные функции, остальная часть реализует ядро обнаружения и исправления.
Дополнительные исправления Btrfs в 7.2-rc7
Параллельно были применены и другие критические патчи для стабильности файловой системы:
- Утечка памяти: исправлена утечка в ioctl-операции записи с кодированием.
- Highmem: отключена поддержка больших folio (large folios) на системах с высокой памятью (highmem).
- THP: отключена поддержка размеров блоков, превышающих размер страницы, на системах без поддержки прозрачных огромных страниц (Transparent Hugepages).
| Компонент | Статус в Linux 7.2-rc7 | Причина изменения |
|---|---|---|
| COW Fixup Worker | Восстановлен | Предотвращение тихой потери данных |
| Large Folios (Highmem) | Отключено | Избежание нестабильности на системах с высокой памятью |
| Block Size > Page Size | Отключено | Совместимость с системами без THP |
| Encoded ioctl write | Исправлено | Устранение утечки памяти |
Значение для пользователей
Это исправление критически важно для всех, кто использует Btrfs в продакшен-средах. Ожидается, что фикс войдет в стабильный релиз ядра v7.2 в конце текущего месяца. Игнорирование этого обновления может привести к необратимым потерям данных на дисках с этой файловой системой.
Источник: Phoronix ↗
