Subject: limiting the error correction attempts in wd driver
To: None <current-users@netbsd.org>
From: Laine Stump <lainestump@rcn.com>
List: current-users
Date: 12/09/2002 02:38:02
My mom's hard disk (one of the infamous IBM Deskstars) has bitten the 
proverbial big one, and I'm trying to recover as much of her stuff as 
possible (mostly just email archives, thankfully - all her jpegs of scanned 
family photos were already backed up). Most of the sectors appear to still 
be readable, but every 50 - 1000 sectors there seems to be a bad one.

My first try was to just do:

   dd if=/dev/rwd0d of=/dev/rwd1d count=xxx conv=noerror,sync

There are two problems with this:

   1) each time an bad sector is encountered, the kernel retries 6
      times and, as expected, fails all 6. I'm concerned that the
      drive is going downhill *fast*, and don't want to waste time
      or wear/tear doing all those retries - during that time,
      things might get worse and I'd get back less info than I
      otherwise could have (last year I managed to recover my
      wife's entire 6GB laptop drive contents after it dropped
      from a table onto a hardwood floor, but within an hour or
      so after getting the last file, the drive was completely
      unusable).

   2) sectors appear to be read in blocks of 4, so dd gets an error
      on sector 62 4 times - once each when it tries to read sector
      62, 63, 64, and 65. This means a) there are a total of 24
      retries for each bad sector, and b) (I'm not sure about this)
      possibly the contents of sectors 63-65 will come up as nulls
      even though they may possibly be okay.

So, I'm looking for ways to 1) disable retries on wd read failures, and 2) 
unblock the reads, so that failed sectors won't be reread. I took a quick 
look through wdc.c and man pciide, and didn't see any likely constants. Can 
someone give me some hints?