Вышел OpenZFS 2.4.4, очередное сервисное обновление открытой реализации ZFS. В выпуске расширена совместимость с ядром Linux 7.2 и появилась новая возможность восстановления пулов, пострадавших от проблем с Multi-Modifier Protection (MMP).

В этом выпуске официально поддерживаемый диапазон ядер Linux теперь составляет от 4.18 до 7.2. В обновление включены доработки совместимости с Linux 7.2, например код суперблока ZFS переведён на интерфейс ядра sget_fc(). OpenZFS 2.4.4 продолжает поддерживать FreeBSD, в списке совместимых платформ указаны FreeBSD 13.3 и новее, а также 14.0 и новее.

Ещё одно заметное дополнение: новая команда zhack mmp reclaim, предназначенная для восстановления пула, оставшегося в нерабочем состоянии из-за Multi-Modifier Protection. MMP защищает OpenZFS от одновременного импорта и изменения одного и того же пула несколькими системами. Без этой защиты это могло бы привести к повреждению данных.

Изменения в MMP позволяют OpenZFS точнее различать неудачную попытку захвата uberblock и реальную активность другого узла. Реализация также пропускает виртуальные устройства, доступные только для чтения, при проверках активности и улучшает обработку деградировавших зеркал, у которых часть ветвей помечена как отсутствующая.

В OpenZFS 2.4.4 зависимость systemd-udev-settle для systemd-юнитов импорта пулов стала необязательной. Теперь юниту импорта не нужно безусловно дожидаться окончания обработки устройств со стороны udev.

В части исправлений устранено несколько проблем, связанных с таблицей дедупликации (DDT). Среди них: переполнение отрицательного времени при очистке DDT, несколько ошибок очистки, недостаточная блокировка при проверке дедупликации и некорректная маркировка счётчиков ссылок в журнале DDT.

Пользователи L2ARC получили исправление, ограничивающее перестроение позицией write hand при первом проходе. Также OpenZFS исправляет чтение блоков, освобождённых после клонирования, и ограничивает частоту событий проверки Direct I/O, чтобы не порождать чрезмерное количество событий.

В Linux-версии исправлен бесконечный цикл в zfs_write(), который мог возникать при работе с буфером, к которому нельзя применить page fault (unfaultable). Также исправлено чтение через mmap() за пределами конца файла и обновление временных меток mtime и ctime при увеличении файла через fallocate().

В управлении пулами внесено несколько исправлений. Команда zpool export теперь возвращает EBUSY, если minor-устройства zvol, принадлежащие пулу, всё ещё используются, а не продолжает работу при невозможности корректно экспортировать пул. Также устранена гонка между завершением удаления устройства и экспортом пула.

В OpenZFS 2.4.4 также исправлены приём больших разделённых блоков с коротким конечным фрагментом, поведение zfs receive -x и потенциальное разыменование нулевого указателя в коде получения DMU. Выпуск также исправляет устаревший кэш POSIX ACL, который мог сохраняться после отката.

Для делегированного администрирования в OpenZFS появилось новое право send:encrypted. Оно позволяет точнее контролировать, разрешено ли делегированным пользователям отправлять зашифрованные датасеты.

Среди других изменений: улучшенная проверка прав доступа к устройствам, более безопасная работа со строками и памятью в libzfs, исправления возобновлённых отправок, улучшения автоматического расширения пула при изменении ёмкости разделов на дисках, а также ряд обновлений сборки, CI, тестового набора и поддержки FreeBSD.

Подробности в списке изменений.