Des versions correctrices du projet OpenZFS 2.1.14 et 2.2.2, qui développe l'implémentation du système de fichiers ZFS pour Linux et FreeBSD, ont été préparées. Les mises à jour corrigent un problème dans le code de vérification de la cohérence du cache dnode, qui provoquait des dommages aux données dans les fichiers contenant des zones vides lors de leur copie après modification.
Au départ, le problème a été tenté de résoudre dans la version 2.2.1, mais la correction s'est révélée inefficace. L'erreur est restée inaperçue pendant longtemps et a commencé à se manifester après les modifications apportées à l'utilitaire « cp » dans le paquet coreutils 9.x. Il est supposé qu'avec Red Hat Enterprise Linux et les distributions basées sur celui-ci, le problème ne se manifeste pas, car dans RHEL 9, le paquet coreutils 8.x avec une logique différente de l'utilitaire « cp » est utilisé.
Le problème se manifeste lors de l'utilisation d'utilitaires de copie de fichiers capables de détecter et d'optimiser les zones vides dans les fichiers. Des dommages peuvent survenir dans des systèmes de fichiers chargés lors de la copie d'un fichier, si l'opération est effectuée peu après une modification et que certaines données ne résident que dans le cache sale et n'ont pas encore été écrites sur le disque.
Pour optimiser le travail avec les zones vides dans les fichiers, OpenZFS, à partir de la version 0.6.2, prend en charge les opérations SEEK_HOLE et SEEK_DATA, qui permettent de sauter une zone vide du fichier lors de la lecture depuis le disque. La reconnaissance des zones vides et la sauvegarde des informations à leur sujet ne se font qu'après l'écriture sur disque de toutes les données restantes dans le cache liées au fichier. Pour initier ce vidage dans OpenZFS, un contrôle évalue la présence dans le cache de données non sauvegardées et effectue un vidage forcé des informations sur le disque, nécessaire à l'utilisation de SEEK_HOLE et SEEK_DATA.
Malheureusement, la vérification s'est révélée incomplète et, dans certaines circonstances, les données sur l'état de la réinitialisation étaient incorrectes. Anciennes informations sur le contenu du fichier étaient présentes sur le disque, si la requête tombait dans une petite fenêtre temporelle entre deux opérations de réinitialisation des données du cache. Les opérations de lecture, optimisant le chargement des zones vides, pouvaient, à ce moment-là, négliger la lecture d'une partie des données, les considérant comme vides, alors que le programme travaillant avec le fichier avait pu apporter des modifications aux zones vides au préalable. En conséquence, l'utilisation de l'outil « cp » pouvait entraîner la création d'une copie contenant des zones vides là où il n'y en avait pas dans le fichier original.
Source : opennet.ru
