Byly vytvořeny opravné verze projektu OpenZFS 2.1.14 a 2.2.2, které rozvíjejí implementaci souborového systému ZFS pro Linux a FreeBSD. V aktualizacích byla odstraněna chyba v kódu ověřování konzistence cache dnode, která vedla k poškození dat v souborech obsahujících prázdné oblasti při jejich kopírování po provedení změn.
Původně se problém pokusili vyřešit ve verzi 2.2.1, ale oprava se ukázala jako neúčinná. Chyba zůstávala dlouho nepovšimnuta a začala se projevovat až po změnách provedených v utilitě "cp" v balíčku coreutils 9.x. Předpokládá se, že v Red Hat Enterprise Linux a jeho odvozeninách se problém neprojevuje, protože v RHEL 9 je použita verze coreutils 8.x s jinou logikou chování utility "cp".
Problém se projevuje při použití utilit pro kopírování souborů, které dokážou detekovat a optimalizovat prázdné oblasti v souborech. Poškození může nastat na přetížených souborových systémech při kopírování souboru, pokud je operace provedena téměř okamžitě po změně a část dat zůstává pouze v dirty-cache a ještě nebyla zapsána na disk.
Pro optimalizaci práce s prázdnými oblastmi v souborech, OpenZFS, počínaje verzí 0.6.2, podporuje operace SEEK_HOLE a SEEK_DATA, které umožňují přeskočit prázdnou oblast souboru při čtení z disku. Rozpoznání prázdných oblastí a uchovávání informací o nich se provádí pouze po zapsání všech zbývajících dat v cache, které jsou spojeny se souborem, na disk. Pro iniciaci zápisu má OpenZFS kontrolu, která vyhodnocuje přítomnost nesetřených dat v cache a provádí nucený zápis informací na disk, což je nutné pro použití SEEK_HOLE a SEEK_DATA.
Bohužel, kontrola se ukázala jako neúplná, a při specifických okolnostech byly údaje o stavu resetu určeny nesprávně, což vedlo k tomu, že na disku byly staré informace o obsahu souboru, pokud se dotaz dostal do malého časového okna mezi dvěma operacemi resetu dat z cache. Operace čtení, které optimalizují načítání prázdných oblastí, v tomto okamžiku mohly přehlédnout část dat, považujíce je za prázdné, zatímco program pracující se souborem mohl předtím provést změny v prázdných oblastech. Výsledkem bylo, že použití utility „cp“ mohlo vést k vytvoření kopie, která obsahovala prázdné oblasti tam, kde v originálním souboru nebyly.
Zdroj: opennet.ru
