Foram formados lançamentos corretivos dos projetos OpenZFS 2.1.14 e 2.2.2, que desenvolvem a implementação do sistema de arquivos ZFS para Linux e FreeBSD. As atualizações corrigem um problema no código de verificação da consistência do cache dnode, que levava à corrupção de dados em arquivos que continham áreas vazias ao serem copiados após a realização de alterações.
Inicialmente, a questão foi tentada resolver na versão 2.2.1, mas a correção se mostrou ineficaz. O erro permaneceu não detectado por muito tempo e começou a se manifestar após as alterações feitas na utilidade 'cp' no pacote coreutils 9.x. Supõe-se que, no Red Hat Enterprise Linux e nas distribuições baseadas nele, o problema não se manifesta, uma vez que no RHEL 9 é utilizado o pacote coreutils 8.x, com uma lógica diferente para a utilidade 'cp'.
O problema se manifesta ao usar utilitários de cópia de arquivos que conseguem identificar e otimizar áreas vazias em arquivos. A corrupção pode ocorrer em sistemas de arquivos sobrecarregados ao copiar um arquivo, se a operação for realizada quase imediatamente após uma alteração e parte dos dados permanecer apenas no cache sujo e ainda não for despejada no disco.
Para otimizar o trabalho com áreas vazias em arquivos, o OpenZFS, a partir da versão 0.6.2, suporta as operações SEEK_HOLE e SEEK_DATA, que permitem ignorar a área vazia do arquivo ao ler do disco. O reconhecimento de áreas vazias e a preservação das informações sobre elas são realizados somente após o despejo no disco de todos os dados restantes no cache relacionados ao arquivo. Para iniciar o despejo no OpenZFS, existe uma verificação que avalia a presença de dados não salvos no cache e realiza o despejo forçado das informações no disco, necessário para a utilização de SEEK_HOLE e SEEK_DATA.
Infelizmente, a verificação foi incompleta e, em determinadas circunstâncias, os dados sobre o estado do reset foram determinados incorretamente, levando a que informações antigas sobre o conteúdo do arquivo permanecessem no disco, caso a solicitação caísse em uma pequena janela de tempo entre duas operações de reset de dados do cache. As operações de leitura, que otimizam a carga de áreas vazias, nesse momento puderam não ler parte dos dados, considerando-os vazios, enquanto o programa que trabalhava com o arquivo poderia ter feito alterações em áreas vazias anteriormente. Como resultado, o uso da ferramenta 'cp' poderia levar à criação de uma cópia que contém áreas vazias onde não havia no arquivo original.
Fonte: opennet.ru
