mirror of
https://github.com/freemkv/libfreemkv.git
synced 2026-10-07 18:13:10 +00:00
The 'reset, read good data, come back for one sector' technique. A genuinely-damaged sector makes the drive grind its full recovery timeout and still fail; re-reading consecutive bad LBAs at identical conditions re-fails AND is the rapid-failure cadence that drops the BU40N into a firmware fast-fail wedge (CLAUDE.md hard-rule #2). scatter_recover: on a stuck single sector, make up to SCATTER_MAX_ATTEMPTS fresh tries, each preceded by read_good_sectors() — a seek to a far known-good anchor + a sustained read that re-seats the head/servo and breaks the failure cadence. The fresh re-read uses the FAST timeout (recovery=false) so a recalibrated marginal sector reads quick and a truly-dead one fails fast instead of burning 60s per attempt. The seek + good read IS the settle (matches ddrescue/MakeMKV) — no idle sleep. Gated to genuine single-sector MEDIUM_ERROR (0x03): transport faults still abort the pass, NOT_READY keeps its own retry path, wedge-family senses are left for cooldown/eject. A scatter recovery is recorded exactly like a normal read success (write-then-mark-Finished); nothing marks a range good without a successful read + write. Logs anchor_ms/reread_ms per attempt for live tuning. 5 fixture tests (recover-marginal, give-up-dead, skip-non-medium, skip-batch, AACS widen); 2 AB read-count guards raised for scatter's bounded extra reads. Precommit green on Rust 1.86.