Актуализация на OpenZFS 2.1.14 и 2.2.2, с отстраняване на грешка, водеща до повреждане на файлове.

Формулирани са коригиращи издания на проекта 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

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster