Създадени са коригиращи издания на проекта OpenZFS 2.1.14 и 2.2.2, който развива реализацията на файловата система ZFS за Linux и FreeBSD. В актуализациите е отстранен проблем в кода за проверка на консистентността на кеша dnode, водещ до повреда на данни в файлове, съдържащи празни области, при копиране след извършване на промени.
Изначально проблему попытались устранить в версии 2.2.1, но исправление оказалось неэффективно. Ошибка долгое время оставалась незамеченной и начала проявляться после изменений, внесённых в утилиту «cp» в пакете coreutils 9.x. Предполагается, что в Red Hat Enterprise Linux и дистрибутивах на его основе проблема не проявляется, так как в RHEL 9 используется пакет coreutils 8.x с иной логикой работы утилиты «cp».
Проблемът се проявява при използване на утилити за копиране на файлове, които могат да определят и оптимизират празни области в файловете. Повредата може да възникне в натоварени файлови системи при копиране на файл, ако операцията е извършена почти веднага след промяна и част от данните остава само в dirty кеша и все още не е записана на диска.
За оптимизация на работата с празни области в файловете, OpenZFS, започвайки от версия 0.6.2, поддържа операции SEEK_HOLE и SEEK_DATA, които позволяват прескочване на празна област на файла при четене от диска. Разпознаването на празни области и съхранението на информация за тях се извършва само след записването на диска на всички оставящи се в кеша данни, свързани с файла. За иницииране на запис в OpenZFS има проверка, която оценява присъствието в кеша на несъхранени данни и извършва принудителен запис на информацията на диска, необходима за използване на SEEK_HOLE и SEEK_DATA.
К сожалению проверка оказалась неполной и при некотором стечении обстоятельств данные о состоянии сброса определялось не верно и на диске находилась старая информация о содержимом файла, если запрос попадал в небольшое временное окно между двумя операциями сброса данных из кэша. Операции чтения, оптимизирующие загрузку пустых областей, в этот момент могли пропустить чтение части данных, посчитав их пустыми, в то время как работающая с файлом программа до этого могла внести в пустые области изменения. В результате применение утилиты «cp» могло привести к созданию копии, содержащей пустые области там, где их не было в оригинальном файле.
Източник: opennet.ru
