Kiadásra került az OpenZFS 2.1.14 és 2.2.2 javítófrissítése, amely a ZFS fájlrendszer Linuxra és FreeBSD-re történő implementálását fejleszti. A frissítésekben megoldották a dnode cache konzisztenciájának ellenőrzésére vonatkozó kód hibáját, amely adatkárosodást okozhatott a fájlokban, ha azok üres területeket tartalmaztak, a módosítások utáni másolás során.
Eredetileg a problémát a 2.2.1 verzióban próbálták orvosolni, de a javítás hatástalan volt. A hiba sokáig észrevétlen maradt, és a coreutils 9.x csomagban végrehajtott változtatások után kezdett megnyilvánulni. Feltételezések szerint a Red Hat Enterprise Linuxban és az azzal alapuló disztribúciókban a probléma nem jelentkezik, mivel a RHEL 9 a coreutils 8.x csomagot használja, amely eltérő logikával működteti a "cp" segédprogramot.
A probléma a fájlok másolására képes eszközök használatakor jelentkezik, amelyek képesek az üres területek azonosítására és optimalizálására a fájlokban. Károsodás léphet fel a terhelt fájlrendszerekben, amikor egy fájlt másolnak, ha a művelet szinte azonnal a módosítás után történik, és egy részadat csak a dirty cache-ben marad, és még nem kerül kiírásra a lemezre.
Az üres területek kezelése érdekében az OpenZFS a 0.6.2 verziótól kezdődően támogatja a SEEK_HOLE és SEEK_DATA műveleteket, amelyek lehetővé teszik az üres fájlterületek átugrását lemezről való olvasáskor. Az üres területek azonosítása és róluk szóló információk megőrzése csak akkor történik, miután az összes, fájlhoz kapcsolódó, cache-ben található adat kiírásra került a lemezre. Az OpenZFS-ben a kiírás megkezdéséhez van egy ellenőrzés, amely értékeli a cache-ben lévő nem mentett adatok jelenlétét, és kényszerített kiírást végez a lemezre, amely szükséges a SEEK_HOLE és SEEK_DATA használatához.
Sajnos az ellenőrzés nem volt teljes, és bizonyos körülmények között a visszaállítási státuszra vonatkozó adatok helytelenül lettek meghatározva, így a lemezen régi információk maradtak a fájl tartalmáról, ha a kérés beleesett egy kis időablakba a két adatkiürítési művelet között. Az olvasási műveletek, amelyek az üres területek betöltését optimalizálják, ebben a pillanatban kihagyhatták egyes adatok olvasását, mivel üresnek számítottak, miközben a fájlra dolgozó program korábban módosításokat végezhetett az üres területeken. Ennek eredményeként a „cp” segédprogram használata olyan másolat létrejöttét eredményezhette, amely üres területeket tartalmazott ott, ahol az eredeti fájlban nem voltak.
Forrás: opennet.ru
