Au fost formulate versiuni corective pentru proiectul OpenZFS 2.1.14 și 2.2.2, care dezvoltă implementarea sistemului de fișiere ZFS pentru Linux și FreeBSD. În actualizări a fost remediată problema din codul de verificare a coerenței cache-ului dnode, care ducea la deteriorarea datelor în fișierele ce conțineau zone goale, în urma copiilor efectuate după modificări.
Inițial, problema a fost abordată în versiunea 2.2.1, dar soluția s-a dovedit a fi ineficientă. Eroarea a rămas nedetectată timp îndelungat și a început să se manifeste după modificările aduse utilitarului „cp” din pachetul coreutils 9.x. Se presupune că în Red Hat Enterprise Linux și distribuțiile bazate pe acesta, problema nu apare, deoarece în RHEL 9 este utilizat pachetul coreutils 8.x cu o logică diferită de funcționare a utilitarului „cp”.
Problema se manifestă atunci când se folosesc utilitare de copiere a fișierelor care pot detecta și optimiza zonele goale din fișiere. Deteriorarea poate apărea în sistemele de fișiere solicitate în timpul copiei unui fișier, dacă operațiunea este efectuată aproape imediat după o modificare și o parte din date rămâne doar în cache-ul dirty și nu a fost încă scrisă pe disc.
Pentru a optimiza lucrul cu zonele goale din fișiere, OpenZFS, începând cu versiunea 0.6.2, suportă operațiunile SEEK_HOLE și SEEK_DATA, care permit omisiunea zonei goale a fișierului în timpul citirii de pe disc. Recunoașterea zonelor goale și păstrarea informațiilor despre acestea se realizează doar după scrierea pe disc a tuturor datelor rămase în cache legate de fișier. Pentru a iniția scrierea în OpenZFS, există o verificare care evaluează prezența în cache a datelor nesalvate și efectuează o scriere forțată a informațiilor pe disc, necesară pentru utilizarea SEEK_HOLE și SEEK_DATA.
Din păcate, verificarea s-a dovedit incompletă și, în anumite circumstanțe, datele despre starea resetării au fost stabilite greșit, iar pe disc se află informații vechi despre conținutul fișierului, dacă cererea a căzut într-o fereastră temporară mică între cele două operațiuni de resetare a datelor din cache. Operațiunile de citire, care optimizează încărcarea zonelor goale, în acest moment au putut omite citirea unei părți din date, considerându-le goale, în timp ce programul care lucra cu fișierul a putut anterior să efectueze modificări în zonele goale. Ca urmare, utilizarea utilitarului „cp” ar fi putut duce la crearea unei copii care conținea zone goale acolo unde nu erau în fișierul original.
Sursa: opennet.ro
