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?