Se han generado las versiones correctivas del proyecto OpenZFS 2.1.14 y 2.2.2, que desarrollan la implementación del sistema de archivos ZFS para Linux y FreeBSD. En las actualizaciones se ha solucionado un problema en el código de verificación de coherencia de la caché dnode, que provocaba la corrupción de datos en archivos que contenían áreas vacías, al copiarlos después de realizar cambios.
Inicialmente, se intentó solucionar el problema en la versión 2.2.1, pero la corrección resultó ser ineficaz. El error permaneció sin ser detectado durante mucho tiempo y comenzó a manifestarse tras los cambios realizados en la utilidad 'cp' en el paquete coreutils 9.x. Se supone que en Red Hat Enterprise Linux y en distribuciones basadas en él, el problema no se manifiesta, ya que en RHEL 9 se utiliza el paquete coreutils 8.x con una lógica diferente en la utilidad 'cp'.
El problema se manifiesta al utilizar utilidades de copia de archivos que pueden detectar y optimizar áreas vacías en los archivos. La corrupción puede ocurrir en sistemas de archivos cargados al copiar un archivo, si la operación se realiza casi inmediatamente después de un cambio y parte de los datos permanece solo en la caché sucia y aún no se ha volcado en el disco.
Para optimizar el trabajo con áreas vacías en los archivos, OpenZFS, desde la versión 0.6.2, admite operaciones SEEK_HOLE y SEEK_DATA, que permiten omitir un área vacía del archivo al leer desde el disco. El reconocimiento de áreas vacías y el almacenamiento de información sobre ellas se realiza solo después de volcar al disco todos los datos restantes en caché relacionados con el archivo. Para iniciar el volcado, OpenZFS tiene una verificación que evalúa la presencia de datos no guardados en la caché y realiza un volcado forzado de información al disco, necesario para utilizar SEEK_HOLE y SEEK_DATA.
Desafortunadamente, la verificación resultó ser incompleta y, bajo ciertas circunstancias, los datos sobre el estado del restablecimiento no se determinaron correctamente, y el disco contenía información antigua sobre el contenido del archivo, si la solicitud caía en un pequeño intervalo de tiempo entre dos operaciones de restablecimiento de datos del caché. Las operaciones de lectura, que optimizan la carga de áreas vacías, en ese momento podían haber omitido la lectura de parte de los datos, considerándolos vacíos, mientras que el programa que trabajaba con el archivo podría haber realizado cambios en esas áreas vacías previamente. Como resultado, el uso de la herramienta 'cp' podría haber llevado a la creación de una copia que contenía áreas vacías donde no existían en el archivo original.
Fuente: opennet.ru
