Janë formuar lëshime korrigjuese për projektin OpenZFS 2.1.14 dhe 2.2.2, që zhvillon implementimin e sistemit të skedarëve ZFS për Linux dhe FreeBSD. Në përditësime është zgjidhur problemi në kodin e kontrollit të qëndrueshmërisë së caches dnode, që çonte në dëmtimin e të dhënave në skedarët që përmbanin zona të zbrazëta, para se ato të kopjoheshin pas ndryshimeve.
Fillimisht problemi u përpoq të zgjidhej në versionin 2.2.1, por korrigjimi doli të ishte i pasuksesshëm. Gabimi ka mbetur për një kohë të gjatë i padukur dhe filloi të shfaqet pas ndryshimeve të bëra në utilitarin 'cp' në paketën coreutils 9.x. Presupozohet se në Red Hat Enterprise Linux dhe distribucione të tjera mbi këtë bazë problemi nuk shfaqet, pasi në RHEL 9 përdoret paketa coreutils 8.x me një logjikë të ndryshme pune për utilitarin 'cp'.
Problemi shfaqet gjatë përdorimit të utilitarëve të kopjimit të skedarëve, që dinë të përcaktojnë dhe optimizojnë zonat e zbrazëta në skedarë. Dëmtimi mund të ndodhte në sistemet e skedarëve të ngarkuara gjatë kopjimit të një skedari, nëse operacioni kryhet pothuajse menjëherë pas një ndryshimi dhe një pjesë e të dhënave mbetet vetëm në cache-in dirty dhe ende nuk është shkarkuar në disk.
Për të optimizuar punën me zonat e zbrazëta në skedarë, OpenZFS, që nga lëshimi 0.6.2, mbështet operacionet SEEK_HOLE dhe SEEK_DATA, që lejojnë kalimin e zonës së zbrazët të skedarit gjatë leximit nga disku. Përcaktimi i zonave të zbrazëta dhe ruajtja e informacionit për to bëhet vetëm pas shkarkimit në disk të të gjithë të dhënave që mbeten në cache, të lidhura me skedarin. Për të iniciuar shkarkimin në OpenZFS ekziston një kontroll, që vlerëson praninë në cache të të dhënave të pa ruajtura dhe bën një shkarkim të detyrueshëm të informacionit në disk, të nevojshëm për përdorimin e SEEK_HOLE dhe SEEK_DATA.
Fatkeqësisht, kontrolli rezultoi të ishte i paplotë dhe nën disa rrethana, të dhënat mbi gjendjen e shkarkimit përcaktoheshin gabimisht dhe në disk ndodhej informacioni i vjetër mbi përmbajtjen e skedarit, nëse kërkesa binte në një dritare të vogël kohore midis dy operacioneve të shkarkimit të të dhënave nga cache. Operacionet e leximit, që optimizojnë ngarkimin e zonave të zbrazëta, në atë moment mund të kishin anashkaluar leximin e një pjese të të dhënave, duke e konsideruar ato të zbrazëta, ndërsa programi që punon me skedarin mund të kishte bërë ndryshime në zonat e zbrazëta më parë. Si rezultat, përdorimi i utilitarit 'cp' mund të kishte rezultuar në krijimin e një kopjeje, që përmbante zona të zbrazëta atje ku nuk kishte pasur në skedarin origjinal.
Burimi: opennet.ru
