Sono stati rilasciati gli aggiornamenti correttivi del progetto OpenZFS 2.1.14 e 2.2.2, che sviluppano l'implementazione del file system ZFS per Linux e FreeBSD. Gli aggiornamenti risolvono un problema nel codice di verifica della coerenza della cache dnode, che portava a danneggiamenti nei file contenenti aree vuote durante la loro copia dopo che erano stati apportati cambiamenti.
Inizialmente, si è cercato di risolvere il problema nella versione 2.2.1, ma la correzione si è rivelata inefficace. L'errore è rimasto inosservato a lungo e ha cominciato a manifestarsi dopo le modifiche apportate allo strumento 'cp' nel pacchetto coreutils 9.x. Si presume che in Red Hat Enterprise Linux e nelle sue distribuzioni derivate il problema non si manifesti, poiché in RHEL 9 viene utilizzato il pacchetto coreutils 8.x con una logica di funzionamento differente per lo strumento 'cp'.
Il problema si verifica utilizzando strumenti di copia file che sono in grado di identificare e ottimizzare le aree vuote nei file. Il danneggiamento può verificarsi su filesystem sovraccarichi durante la copia di un file se l'operazione è eseguita quasi immediatamente dopo una modifica e parte dei dati rimane solo nella cache sporca e non è ancora stata scritta su disco.
Per ottimizzare il lavoro con le aree vuote nei file, OpenZFS, a partire dalla versione 0.6.2, supporta le operazioni SEEK_HOLE e SEEK_DATA, che consentono di saltare le aree vuote del file durante la lettura dal disco. Il riconoscimento delle aree vuote e la memorizzazione delle informazioni su di esse avviene solo dopo che tutti i dati rimanenti nella cache relativi al file sono stati scritti su disco. Per innescare il processo di scrittura in OpenZFS è presente un controllo che valuta la presenza di dati non salvati nella cache e effettua una scrittura forzata delle informazioni su disco necessaria per l'utilizzo di SEEK_HOLE e SEEK_DATA.
Sfortunatamente, la verifica si è rivelata incompleta e, in determinate circostanze, i dati sullo stato del ripristino sono stati determinati in modo errato e sul disco si trovavano informazioni obsolete sul contenuto del file, se la richiesta cadeva in un breve intervallo di tempo tra due operazioni di ripristino dei dati dalla cache. Le operazioni di lettura che ottimizzano il caricamento delle aree vuote, in quel momento, potevano saltare la lettura di parte dei dati, considerandoli vuoti, mentre il programma che stava gestendo il file poteva aver apportato modifiche a quelle aree vuote. Di conseguenza, l'uso dell'utility "cp" potrebbe aver portato alla creazione di una copia contenente aree vuote dove non ce ne erano nel file originale.
Fonte: opennet.ru
