v0.11.9: fast verify reads — 5s timeout, no recovery loop

This commit is contained in:
Matt Jackson
2026-04-20 01:01:44 +00:00
parent e90c429432
commit 8a256cc620
5 changed files with 47 additions and 5 deletions
+30
View File
@@ -542,6 +542,32 @@ impl Drive {
Err(Error::DiscRead { sector: lba as u64 })
}
/// Fast single-attempt read for verification — no recovery, short timeout.
/// Returns Ok on success, Err on any failure. Does not retry.
pub fn read_fast(&mut self, lba: u32, count: u16, buf: &mut [u8]) -> Result<usize> {
let cdb = [
crate::scsi::SCSI_READ_10,
0x00,
(lba >> 24) as u8,
(lba >> 16) as u8,
(lba >> 8) as u8,
lba as u8,
0x00,
(count >> 8) as u8,
count as u8,
0x00,
];
match self.scsi.as_mut().execute(
&cdb,
crate::scsi::DataDirection::FromDevice,
buf,
5_000, // 5 second timeout — enough for healthy reads, fast fail for bad sectors
) {
Ok(result) => Ok(result.bytes_transferred),
Err(_) => Err(Error::DiscRead { sector: lba as u64 }),
}
}
/// Read the disc capacity in sectors (2048 bytes each).
pub fn read_capacity(&mut self) -> Result<u32> {
let cdb = [
@@ -643,6 +669,10 @@ impl SectorReader for Drive {
fn read_sectors(&mut self, lba: u32, count: u16, buf: &mut [u8]) -> Result<usize> {
self.read(lba, count, buf)
}
fn read_sectors_fast(&mut self, lba: u32, count: u16, buf: &mut [u8]) -> Result<usize> {
self.read_fast(lba, count, buf)
}
}
/// Find all optical drives connected to this system.