Es wurden korrigierende Versionen des Projekts OpenZFS 2.1.14 und 2.2.2 erstellt, die die Implementierung des Dateisystems ZFS für Linux und FreeBSD weiterentwickeln. In den Updates wurde ein Problem im Code zur Überprüfung der Konsistenz des dnode-Caches behoben, das zu Datenbeschädigungen in Dateien führen konnte, die leere Bereiche enthielten, wenn sie nach Änderungen kopiert wurden.
Ursprünglich wurde versucht, das Problem in Version 2.2.1 zu beheben, doch die Korrektur erwies sich als ineffektiv. Der Fehler blieb lange unbemerkt und begann nach Änderungen, die in das Dienstprogramm „cp“ im Paket coreutils 9.x eingeführt wurden, sichtbar zu werden. Es wird angenommen, dass das Problem in Red Hat Enterprise Linux und in darauf basierenden Distributionen nicht auftritt, da in RHEL 9 das Paket coreutils 8.x mit einer anderen Logik für das Dienstprogramm „cp“ verwendet wird.
Das Problem tritt bei der Verwendung von Dateiübertragungswerkzeugen auf, die leere Bereiche in Dateien erkennen und optimieren können. Eine Beschädigung kann in stark belasteten Dateisystemen auftreten, wenn eine Datei kopiert wird, wenn die Operation fast unmittelbar nach einer Änderung durchgeführt wird und ein Teil der Daten nur im Dirty-Cache verbleibt und noch nicht auf die Festplatte geschrieben wurde.
Zur Optimierung des Umgangs mit leeren Bereichen in Dateien unterstützt OpenZFS seit der Veröffentlichung 0.6.2 die Operationen SEEK_HOLE und SEEK_DATA, die es ermöglichen, einen leeren Bereich einer Datei beim Lesen von der Festplatte zu überspringen. Die Erkennung leerer Bereiche und die Speicherung von Informationen darüber erfolgt erst nach dem Schreiben aller verbleibenden, im Cache befindlichen Daten, die mit der Datei verbunden sind, auf die Festplatte. Um den Cache in OpenZFS zu leeren, gibt es eine Überprüfung, die das Vorhandensein von nicht gespeicherten Daten im Cache bewertet und einen erzwungenen Schreibvorgang auf die Festplatte ausführt, der erforderlich ist, um SEEK_HOLE und SEEK_DATA zu verwenden.
Leider war die Überprüfung unvollständig, und unter bestimmten Umständen wurden die Informationen über den Zustand des Zurücksetzens falsch bestimmt, sodass auf der Festplatte alte Informationen über den Inhalt der Datei vorhanden waren, wenn die Anfrage in ein kleines Zeitfenster zwischen zwei Datenrücksetzoperationen fiel. Lesevorgänge, die die Ladeoptimierung leerer Bereiche betreffen, könnten in diesem Moment versäumt haben, einen Teil der Daten zu lesen, da sie als leer betrachtet wurden, während das Programm, das mit der Datei arbeitet, zuvor möglicherweise Änderungen in diese leeren Bereiche eingebracht hatte. Infolgedessen konnte die Verwendung des Dienstprogramms "cp" zur Erstellung einer Kopie führen, die leere Bereiche dort enthielt, wo im Original fehlten.
Quelle: opennet.ru
