Remove eprintln from library — library code should not print to stderr
Drive recovery is silent. Results communicated through return values.
This commit is contained in:
+8
-25
@@ -437,77 +437,60 @@ impl Drive {
|
|||||||
self.recovery_bytes_remaining =
|
self.recovery_bytes_remaining =
|
||||||
self.recovery_bytes_remaining.saturating_sub(bytes_read);
|
self.recovery_bytes_remaining.saturating_sub(bytes_read);
|
||||||
if self.recovery_bytes_remaining == 0 {
|
if self.recovery_bytes_remaining == 0 {
|
||||||
eprintln!("[drive] recovery window complete — resuming full speed");
|
|
||||||
self.set_speed(0xFFFF);
|
self.set_speed(0xFFFF);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Ok(result.bytes_transferred);
|
return Ok(result.bytes_transferred);
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(_) => {}
|
||||||
eprintln!("[drive] read error at LBA {} count {} — {}", lba, count, e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Phase 1: gentle — sleep 30s, retry. 5 times.
|
// Phase 1: gentle — sleep 30s, retry. 5 times.
|
||||||
// No intervention, just patience.
|
|
||||||
self.set_speed(0);
|
self.set_speed(0);
|
||||||
|
|
||||||
for attempt in 1..=5 {
|
for _ in 0..5 {
|
||||||
eprintln!("[drive] phase 1 retry {}/5 at LBA {} — sleep 30s", attempt, lba);
|
|
||||||
std::thread::sleep(std::time::Duration::from_secs(30));
|
std::thread::sleep(std::time::Duration::from_secs(30));
|
||||||
|
|
||||||
match self.scsi.as_mut().execute(
|
match self.scsi.as_mut().execute(
|
||||||
&cdb, crate::scsi::DataDirection::FromDevice, buf, 30_000,
|
&cdb, crate::scsi::DataDirection::FromDevice, buf, 30_000,
|
||||||
) {
|
) {
|
||||||
Ok(result) => {
|
Ok(result) => {
|
||||||
eprintln!("[drive] phase 1 retry {}/5 OK at LBA {}", attempt, lba);
|
|
||||||
self.recovery_bytes_remaining = RECOVERY_WINDOW;
|
self.recovery_bytes_remaining = RECOVERY_WINDOW;
|
||||||
return Ok(result.bytes_transferred);
|
return Ok(result.bytes_transferred);
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(_) => {}
|
||||||
eprintln!("[drive] phase 1 retry {}/5 FAILED at LBA {} — {}", attempt, lba, e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Phase 2: fresh start — close, reset, open, init. Like restarting the app.
|
// Phase 2: fresh start — close, reset, open, init.
|
||||||
eprintln!("[drive] phase 2: fresh start at LBA {}", lba);
|
|
||||||
let device = std::path::PathBuf::from(&self.device_path);
|
let device = std::path::PathBuf::from(&self.device_path);
|
||||||
std::thread::sleep(std::time::Duration::from_secs(5));
|
std::thread::sleep(std::time::Duration::from_secs(5));
|
||||||
let _ = crate::scsi::reset(&device);
|
let _ = crate::scsi::reset(&device);
|
||||||
std::thread::sleep(std::time::Duration::from_secs(5));
|
std::thread::sleep(std::time::Duration::from_secs(5));
|
||||||
self.scsi = match crate::scsi::open(&device) {
|
self.scsi = match crate::scsi::open(&device) {
|
||||||
Ok(s) => s,
|
Ok(s) => s,
|
||||||
Err(e) => {
|
Err(e) => return Err(e),
|
||||||
eprintln!("[drive] reopen failed: {}", e);
|
|
||||||
return Err(e);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
let _ = self.init();
|
let _ = self.init();
|
||||||
let _ = self.wait_ready();
|
let _ = self.wait_ready();
|
||||||
self.set_speed(0);
|
self.set_speed(0);
|
||||||
|
|
||||||
// Phase 3: gentle again on fresh connection — sleep 30s, retry. 5 times.
|
// Phase 3: gentle again on fresh connection — sleep 30s, retry. 5 times.
|
||||||
for attempt in 1..=5 {
|
for _ in 0..5 {
|
||||||
eprintln!("[drive] phase 3 retry {}/5 at LBA {} — sleep 30s", attempt, lba);
|
|
||||||
std::thread::sleep(std::time::Duration::from_secs(30));
|
std::thread::sleep(std::time::Duration::from_secs(30));
|
||||||
|
|
||||||
match self.scsi.as_mut().execute(
|
match self.scsi.as_mut().execute(
|
||||||
&cdb, crate::scsi::DataDirection::FromDevice, buf, 30_000,
|
&cdb, crate::scsi::DataDirection::FromDevice, buf, 30_000,
|
||||||
) {
|
) {
|
||||||
Ok(result) => {
|
Ok(result) => {
|
||||||
eprintln!("[drive] phase 3 retry {}/5 OK at LBA {}", attempt, lba);
|
|
||||||
self.recovery_bytes_remaining = RECOVERY_WINDOW;
|
self.recovery_bytes_remaining = RECOVERY_WINDOW;
|
||||||
return Ok(result.bytes_transferred);
|
return Ok(result.bytes_transferred);
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(_) => {}
|
||||||
eprintln!("[drive] phase 3 retry {}/5 FAILED at LBA {} — {}", attempt, lba, e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Both phases failed. Give up.
|
// Both phases failed.
|
||||||
eprintln!("[drive] FAILED LBA {} count {} — all recovery exhausted", lba, count);
|
|
||||||
self.recovery_bytes_remaining = RECOVERY_WINDOW;
|
self.recovery_bytes_remaining = RECOVERY_WINDOW;
|
||||||
Err(Error::DiscRead { sector: lba as u64 })
|
Err(Error::DiscRead { sector: lba as u64 })
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user