Scrivevo il firmware del disco per WD e una volta scrissi il firmware che riassegnava i blocchi danneggiati.
Innanzitutto, la maggior parte dei blocchi danneggiati viene rilevata nelle letture, non nelle scritture. Le scritture vengono eseguite alla cieca, il che significa che i dati vengono scritti senza essere controllati. Quindi su una scrittura se il supporto è male, non lo saprai fino a quando l'host non farà una lettura in quel settore. C'è una piccola parte del settore (l'intestazione del settore) che viene letta nelle scritture per individuare il settore corretto, in modo che se si verifica un errore nella lettura dell'intestazione del settore, l'unità riassegnerà il settore e lo scriverà con i dati ricevuti dal comando di scrittura. Ma la stragrande maggioranza dei blocchi danneggiati viene rilevata nelle letture e solo perché una scrittura ha successo in un settore non significa che i media siano buoni o che il settore sia stato riassegnato.
Ora sulla riassegnazione dei blocchi danneggiati (chiamata anche riallocazione). Sì, normalmente l'unità tenterà di riassegnare un settore se l'errore è abbastanza grave (ovvero, l'errore ECC è abbastanza grave) ma l'unità potrebbe ancora recuperare i dati dopo la correzione ECC. Di solito questo viene fatto automaticamente. L'unica eccezione è che l'host avrebbe potuto in precedenza dire all'unità di non effettuare riallocazioni automatiche, ma ciò avviene raramente.
Quindi cosa succede se l'unità esegue una lettura e non riesce a recuperare i dati? Niente. L'errore viene segnalato all'host, ma non viene effettuata alcuna riassegnazione. Il problema è che l'unità potrebbe riassegnare il settore, ma non ha la minima idea di quali dati scrivere nel settore appena riassegnato. Se avesse appena scritto un mucchio di zeri, diciamo, e poi il settore fosse stato letto di nuovo, avrebbe restituito tutti gli zeri senza alcuna indicazione che i dati non fossero validi. Questa è essenzialmente la stessa cosa della corruzione dei dati. L'unità non può contare sull'host che tiene traccia degli errori per una serie di motivi (ad esempio, cosa succede se l'unità è stata spostata su un nuovo host?), Quindi il miglior modo di agire è di non fare nulla quando i dati possono " essere recuperato.
Le unità moderne, tuttavia, salveranno la posizione del settore danneggiato quando non può essere riallocata. Il numero di settori danneggiati in attesa di riallocazione è disponibile nei dati SMART. Ciò che accade è se una scrittura viene eseguita in uno dei settori danneggiati in attesa di riallocazione, la riallocazione viene eseguita perché l'unità ora ha dati validi per scrivergli dopo la riallocazione. Quindi, quando la gente dice che scrivere in un brutto settore lo riallocerà, questa è solo metà della storia. L'unità deve essere letta per prima in modo che l'unità possa scoprire tutti i settori danneggiati che non possono essere riallocati automaticamente. In questo modo è possibile scrivere un'intera unità e i dati SMART diranno che non ci sono settori danneggiati in attesa di riallocazione, ma non è stata necessariamente cancellata l'unità di tutti i settori danneggiati. Quindi, se vuoi davvero cancellare un'unità di tutti i settori danneggiati,
Esistono altri modi per gestire blocchi danneggiati che non possono essere riallocati. Se l'unità fa parte di una configurazione RAID ridondante (ovvero, tranne RAID 0), il software RAID dovrebbe recuperare automaticamente i dati per un settore danneggiato dalle altre unità e scriverli nel settore riallocato. I dischi SCSI hanno un comando esplicito di riassegnazione dei blocchi che l'host può utilizzare per forzare la riassegnazione anche quando non ci sono dati validi da scrivere sul blocco, ma il suo utilizzo è piuttosto basso.