Fix five clippy errors that only appear on the target CI lints

CI's clippy job runs on ubuntu-latest, so cfg(target_os = "linux") code is
what the gate actually compiles — and none of it is built by clippy on a
Mac. Five `-D warnings` errors were sitting in drive/linux.rs,
scsi/linux.rs, io/writeback/linux.rs and the Linux arm of drive/mod.rs:
four collapsible let-chains and one manual `% n == 0`. CI was red on the
lint job while the local gate reported all green.

Collapsed into let-chains, which the declared toolchain supports, and
folded drive/mod.rs's length precondition into its chain so the body no
longer needs a nested block.

Found because an agent working on the SCSI backends reported the lints in
passing while checking that a Windows-only file compiled. Worth noting how
it stayed hidden: every one of these files is cfg-gated to a platform this
machine is not, so no amount of local gating would have surfaced them. The
companion change to the precommit script closes that hole.
This commit is contained in:
Matthew Jackson
2026-07-29 22:37:47 -07:00
parent 399c3d2769
commit 921404d135
4 changed files with 44 additions and 52 deletions
+6 -8
View File
@@ -23,14 +23,12 @@ pub fn find_drives() -> Vec<(String, DriveId)> {
if !std::path::Path::new(&path).exists() { if !std::path::Path::new(&path).exists() {
continue; continue;
} }
if let Ok(mut transport) = crate::scsi::open(std::path::Path::new(&path)) { if let Ok(mut transport) = crate::scsi::open(std::path::Path::new(&path))
if let Ok(id) = DriveId::from_drive(transport.as_mut()) { && let Ok(id) = DriveId::from_drive(transport.as_mut())
if !id.raw_inquiry.is_empty() && !id.raw_inquiry.is_empty()
&& (id.raw_inquiry[0] & 0x1F) == SCSI_PERIPHERAL_TYPE_OPTICAL && (id.raw_inquiry[0] & 0x1F) == SCSI_PERIPHERAL_TYPE_OPTICAL
{ {
drives.push((path, id)); drives.push((path, id));
}
}
} }
} }
drives drives
+32 -38
View File
@@ -902,45 +902,39 @@ impl Drive {
// 2026-05-08) dd via /dev/sr0 recovers ~50% of bad // 2026-05-08) dd via /dev/sr0 recovers ~50% of bad
// sectors that a single-shot SG_IO READ misses. // sectors that a single-shot SG_IO READ misses.
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
if recovery { if recovery
if let Some(fd) = self.block_dev_fd { && let Some(fd) = self.block_dev_fd
let len = count as usize * 2048; && buf.len() >= count as usize * 2048
if buf.len() >= len { {
let offset = lba as i64 * 2048; let len = count as usize * 2048;
// Drop kernel cache for this region so we get let offset = lba as i64 * 2048;
// a fresh device read, not stale page-cache // Drop kernel cache for this region so we get
// data from a prior successful neighbour read. // a fresh device read, not stale page-cache
let _ = unsafe { // data from a prior successful neighbour read.
libc::posix_fadvise( let _ = unsafe {
fd, libc::posix_fadvise(fd, offset, len as i64, libc::POSIX_FADV_DONTNEED)
offset, };
len as i64, let n = unsafe {
libc::POSIX_FADV_DONTNEED, libc::pread(fd, buf.as_mut_ptr() as *mut libc::c_void, len, offset)
) };
}; if n == len as isize {
let n = unsafe { tracing::info!(
libc::pread(fd, buf.as_mut_ptr() as *mut libc::c_void, len, offset) target: "freemkv::drive",
}; lba,
if n == len as isize { count,
tracing::info!( bytes = len,
target: "freemkv::drive", "Drive::read recovered via /dev/sr0 pread fallback"
lba, );
count, return Ok(len);
bytes = len,
"Drive::read recovered via /dev/sr0 pread fallback"
);
return Ok(len);
}
tracing::debug!(
target: "freemkv::drive",
lba,
count,
pread_ret = n as i64,
errno = std::io::Error::last_os_error().raw_os_error().unwrap_or(0),
"/dev/sr0 pread fallback also failed"
);
}
} }
tracing::debug!(
target: "freemkv::drive",
lba,
count,
pread_ret = n as i64,
errno = std::io::Error::last_os_error().raw_os_error().unwrap_or(0),
"/dev/sr0 pread fallback also failed"
);
} }
Err(Error::DiscRead { Err(Error::DiscRead {
+1 -1
View File
@@ -272,7 +272,7 @@ impl WritebackPipeline {
self.chunk_bytes, self.chunk_bytes,
self.skip_wait(), self.skip_wait(),
); );
if self.chunk_count % SIZE_LOG_INTERVAL == 0 { if self.chunk_count.is_multiple_of(SIZE_LOG_INTERVAL) {
tracing::debug!( tracing::debug!(
target: "mux", target: "mux",
"WritebackPipeline chunk_bytes={} after {} chunks is_nfs={} degraded={}", "WritebackPipeline chunk_bytes={} after {} chunks is_nfs={} degraded={}",
+5 -5
View File
@@ -169,11 +169,11 @@ impl SgIoTransport {
if dev_name.starts_with("sr") { if dev_name.starts_with("sr") {
let sg_dir = format!("/sys/class/block/{}/device/scsi_generic", dev_name); let sg_dir = format!("/sys/class/block/{}/device/scsi_generic", dev_name);
if let Ok(mut entries) = std::fs::read_dir(&sg_dir) { if let Ok(mut entries) = std::fs::read_dir(&sg_dir)
if let Some(Ok(entry)) = entries.next() { && let Some(Ok(entry)) = entries.next()
let sg_name = entry.file_name(); {
return std::path::PathBuf::from(format!("/dev/{}", sg_name.to_string_lossy())); let sg_name = entry.file_name();
} return std::path::PathBuf::from(format!("/dev/{}", sg_name.to_string_lossy()));
} }
} }