Sometimes when a disk head is failing, a read will be successful but the
actual returned data is garbage - but consistent 'known' garbage. It would
be helpful if the read buffer would be checked for matches to the known
pattern and be marked as bad sectors.

Files containing the search pattern could be passed as arguments on the
command line (like this: --bad-pattern file1.dat --bad-pattern file2.dat)

>>>> Example code:

struct bad_data {
      uint8_t * payload;
      size_t size;
};

std::vector<struct bad_data> bd_list;

>>> and in rescuebook.cc:

for (auto &bd : bd_list)
{
   off_t off = 0; size_t badlen = 0;
   for (; (off + bd.size) <= b.size(); off += bd.size, badlen = 0, off = 0)
{
      if (!memcmp(bd.payload, iobuf() + off, bd.size)) {
        badlen += bd.size;
      } else if (badlen) {
        change_chunk_status( Block( b.pos() + off - bad_size, bad_size ),
Sblock::bad_sector );
        badlen = 0;
      }
   }
   if (badlen)
     change_chunk_status( Block( b.pos() + off - badlen, bad_size ),
Sblock::bad_sector);
}

Reply via email to