diff --git a/CHANGELOG.md b/CHANGELOG.md index f3933cf..c98476b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## 0.13.41 (2026-04-29) + +### Debug logging for sector-0 regression diagnosis + +- Add debug logging to Drive::read and Disc::copy first reads. +- No functional changes. + ## 0.13.40 (2026-04-28) ### Pass 1 pure ECC-block sweep, transport-failure abort, mapfile-based recovery diff --git a/Cargo.toml b/Cargo.toml index e3a26d7..bb6ba4f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "libfreemkv" -version = "0.13.40" +version = "0.13.41" edition = "2024" rust-version = "1.86" license = "AGPL-3.0-only" diff --git a/src/disc/mod.rs b/src/disc/mod.rs index c215f9e..7d7d490 100644 --- a/src/disc/mod.rs +++ b/src/disc/mod.rs @@ -1338,6 +1338,20 @@ impl Disc { let block_count = (block_bytes / 2048) as u16; let recovery = !opts.skip_on_error; + if read_ok_count + read_err_count < 3 { + tracing::info!( + target: "freemkv::disc", + block_lba, + block_count, + block_bytes, + recovery, + skip_on_error = opts.skip_on_error, + batch, + total_bytes, + "Disc::copy first reads" + ); + } + let read_result = reader.read_sectors( block_lba, block_count, diff --git a/src/drive/mod.rs b/src/drive/mod.rs index 9f90ee4..63febc3 100644 --- a/src/drive/mod.rs +++ b/src/drive/mod.rs @@ -444,6 +444,14 @@ impl Drive { } else { crate::scsi::READ_TIMEOUT_MS }; + tracing::debug!( + target: "freemkv::drive", + lba, + count, + recovery, + timeout_ms, + "Drive::read enter" + ); let cdb = [ crate::scsi::SCSI_READ_10, 0x00, @@ -467,6 +475,14 @@ impl Drive { Err(Error::Halted) => Err(Error::Halted), Err(e) => { let (status, sense) = extract_scsi_context(&e); + tracing::warn!( + target: "freemkv::drive", + lba, + count, + inner_error = %e, + scsi_status = status, + "Drive::read checked_exec failed" + ); Err(Error::DiscRead { sector: lba as u64, status: Some(status),