Skip to content

Commit 0efd788

Browse files
Copilotjstarks
andcommitted
Replace redundant test disk implementations with RAM disk backend
Co-authored-by: jstarks <9548354+jstarks@users.noreply.github.com>
1 parent 1d5927e commit 0efd788

5 files changed

Lines changed: 25 additions & 240 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6661,6 +6661,7 @@ dependencies = [
66616661
"async-trait",
66626662
"disk_backend",
66636663
"disk_prwrap",
6664+
"disklayer_ram",
66646665
"futures",
66656666
"getrandom 0.3.3",
66666667
"guestmem",
@@ -8993,7 +8994,6 @@ dependencies = [
89938994
"mesh",
89948995
"pal_async",
89958996
"pal_event",
8996-
"parking_lot",
89978997
"scsi_buffers",
89988998
"task_control",
89998999
"test_with_tracing",

vm/devices/storage/scsidisk/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ getrandom.workspace = true
3737

3838
[dev-dependencies]
3939
disk_prwrap.workspace = true
40+
disklayer_ram.workspace = true
4041
test_with_tracing.workspace = true
4142

4243
[lints]

vm/devices/storage/scsidisk/src/scsidvd/mod.rs

Lines changed: 20 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -2381,12 +2381,8 @@ mod tests {
23812381
use crate::scsi;
23822382
use crate::scsidvd::ISO_SECTOR_SIZE;
23832383
use crate::scsidvd::SimpleScsiDvd;
2384-
use disk_backend::Disk;
2385-
use disk_backend::DiskError;
2386-
use disk_backend::DiskIo;
2384+
use futures::FutureExt;
23872385
use guestmem::GuestMemory;
2388-
use guestmem::MemoryWrite;
2389-
use inspect::Inspect;
23902386
use pal_async::async_test;
23912387
use scsi::AdditionalSenseCode;
23922388
use scsi::ScsiOp;
@@ -2399,117 +2395,25 @@ mod tests {
23992395
use test_with_tracing::test;
24002396
use zerocopy::IntoBytes;
24012397

2402-
#[derive(Debug)]
2403-
struct TestDisk {
2404-
sector_count: u64,
2405-
sector_size: u32,
2406-
storage: Vec<u8>,
2407-
read_only: bool,
2408-
}
2409-
2410-
impl Inspect for TestDisk {
2411-
fn inspect(&self, req: inspect::Request<'_>) {
2412-
req.respond();
2413-
}
2414-
}
2415-
2416-
impl TestDisk {
2417-
pub fn new(sector_size: u32, sector_count: u64, read_only: bool) -> TestDisk {
2418-
let buffer = make_repeat_data_buffer(sector_count as usize, sector_size as usize);
2419-
2420-
TestDisk {
2421-
sector_count,
2422-
sector_size,
2423-
storage: buffer,
2424-
read_only,
2425-
}
2426-
}
2427-
}
2428-
2429-
impl DiskIo for TestDisk {
2430-
fn disk_type(&self) -> &str {
2431-
"test"
2432-
}
2433-
2434-
fn sector_count(&self) -> u64 {
2435-
self.sector_count
2436-
}
2437-
2438-
fn sector_size(&self) -> u32 {
2439-
self.sector_size
2440-
}
2441-
2442-
fn is_read_only(&self) -> bool {
2443-
self.read_only
2444-
}
2445-
2446-
fn disk_id(&self) -> Option<[u8; 16]> {
2447-
None
2448-
}
2449-
2450-
fn physical_sector_size(&self) -> u32 {
2451-
self.sector_size
2452-
}
2453-
2454-
fn is_fua_respected(&self) -> bool {
2455-
false
2456-
}
2457-
2458-
async fn eject(&self) -> Result<(), DiskError> {
2459-
Err(DiskError::UnsupportedEject)
2460-
}
2461-
2462-
async fn read_vectored(
2463-
&self,
2464-
buffers: &RequestBuffers<'_>,
2465-
sector: u64,
2466-
) -> Result<(), DiskError> {
2467-
let offset = sector as usize * self.sector_size() as usize;
2468-
let end_point = offset + buffers.len();
2469-
2470-
if self.storage.len() < end_point {
2471-
return Err(DiskError::IllegalBlock);
2472-
}
2473-
2474-
buffers.writer().write(&self.storage[offset..end_point])?;
2475-
Ok(())
2476-
}
2477-
2478-
async fn write_vectored(
2479-
&self,
2480-
_buffers: &RequestBuffers<'_>,
2481-
_sector: u64,
2482-
_fua: bool,
2483-
) -> Result<(), DiskError> {
2484-
todo!()
2485-
}
2486-
2487-
async fn sync_cache(&self) -> Result<(), DiskError> {
2488-
todo!()
2489-
}
2490-
2491-
async fn unmap(
2492-
&self,
2493-
_sector: u64,
2494-
_count: u64,
2495-
_block_level_only: bool,
2496-
) -> Result<(), DiskError> {
2497-
Ok(())
2498-
}
2499-
2500-
fn unmap_behavior(&self) -> disk_backend::UnmapBehavior {
2501-
disk_backend::UnmapBehavior::Ignored
2502-
}
2503-
}
2504-
2505-
fn new_scsi_dvd(sector_size: u32, sector_count: u64, read_only: bool) -> SimpleScsiDvd {
2506-
let disk = TestDisk::new(sector_size, sector_count, read_only);
2507-
let scsi_dvd = SimpleScsiDvd::new(Some(Disk::new(disk).unwrap()));
2398+
fn new_scsi_dvd(sector_size: u32, sector_count: u64) -> SimpleScsiDvd {
2399+
let disk_size = sector_count * sector_size as u64;
2400+
let disk = disklayer_ram::ram_disk_with_sector_size(disk_size, false, sector_size).unwrap();
2401+
2402+
// Pre-fill the disk with the repeating pattern expected by tests.
2403+
let pattern = make_repeat_data_buffer(sector_count as usize, sector_size as usize);
2404+
let mem = GuestMemory::allocate(pattern.len());
2405+
mem.write_at(0, &pattern).unwrap();
2406+
let buffers = OwnedRequestBuffers::linear(0, pattern.len(), false);
2407+
disk.write_vectored(&buffers.buffer(&mem), 0, false)
2408+
.now_or_never()
2409+
.expect("RAM disk write should not block")
2410+
.unwrap();
2411+
2412+
let scsi_dvd = SimpleScsiDvd::new(Some(disk));
25082413
let sector_shift = ISO_SECTOR_SIZE.trailing_zeros() as u8;
25092414
assert_eq!(scsi_dvd.sector_count(), sector_count / scsi_dvd.balancer());
25102415
assert_eq!(scsi_dvd.sector_shift(), sector_shift);
25112416
if let Media::Loaded(disk) = &*scsi_dvd.media.read() {
2512-
assert_eq!(disk.is_read_only(), read_only);
25132417
assert_eq!(disk.sector_size(), sector_size);
25142418
} else {
25152419
panic!("unexpected Media::Unloaded");
@@ -2638,14 +2542,14 @@ mod tests {
26382542

26392543
#[test]
26402544
fn validate_new_scsi_dvd() {
2641-
new_scsi_dvd(512, 2048, true);
2545+
new_scsi_dvd(512, 2048);
26422546
}
26432547

26442548
#[async_test]
26452549
async fn validate_read16() {
26462550
let sector_size = 512;
26472551
let sector_count = 2048;
2648-
let mut scsi_dvd = new_scsi_dvd(sector_size, sector_count, true);
2552+
let mut scsi_dvd = new_scsi_dvd(sector_size, sector_count);
26492553

26502554
let dvd_sector_size = ISO_SECTOR_SIZE as u64;
26512555
let dvd_sector_count = scsi_dvd.sector_count();
@@ -2680,14 +2584,14 @@ mod tests {
26802584

26812585
#[test]
26822586
fn validate_save_restore_scsi_dvd_no_change() {
2683-
let scsi_dvd = new_scsi_dvd(512, 2048, true);
2587+
let scsi_dvd = new_scsi_dvd(512, 2048);
26842588
let saved_state = save_scsi_dvd(&scsi_dvd);
26852589
restore_scsi_dvd(saved_state, &scsi_dvd);
26862590
}
26872591

26882592
#[test]
26892593
fn validate_save_restore_scsi_dvd_with_sense_data() {
2690-
let scsi_dvd = new_scsi_dvd(512, 2048, true);
2594+
let scsi_dvd = new_scsi_dvd(512, 2048);
26912595
let mut saved_state = save_scsi_dvd(&scsi_dvd);
26922596
saved_state.sense_data = Some(SavedSenseData {
26932597
sense_key: SenseKey::UNIT_ATTENTION.0,

vm/devices/virtio/virtio_blk/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ disklayer_ram.workspace = true
3232
mesh.workspace = true
3333
pal_async.workspace = true
3434
pal_event.workspace = true
35-
parking_lot.workspace = true
3635
test_with_tracing.workspace = true
3736

3837
[lints]

vm/devices/virtio/virtio_blk/src/integration_tests.rs

Lines changed: 3 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,11 @@ use crate::spec::VirtioBlkDiscardWriteZeroes;
1212
use crate::spec::*;
1313
use core::mem::offset_of;
1414
use disk_backend::Disk;
15-
use disk_backend::DiskError;
16-
use disk_backend::DiskIo;
1715
use guestmem::GuestMemory;
18-
use guestmem::MemoryRead;
19-
use guestmem::MemoryWrite;
20-
use inspect::Inspect;
2116
use pal_async::DefaultDriver;
2217
use pal_async::async_test;
2318
use pal_async::wait::PolledWait;
2419
use pal_event::Event;
25-
use parking_lot::Mutex;
26-
use scsi_buffers::RequestBuffers;
2720
use std::time::Duration;
2821
use test_with_tracing::test;
2922
use virtio::QueueResources;
@@ -828,118 +821,6 @@ async fn sector_offset_correctness(driver: DefaultDriver) {
828821
assert!(buf.iter().all(|&b| b == 0), "sector 9 should be zeroes");
829822
}
830823

831-
// --- 4K-sector test disk ---
832-
833-
/// A simple in-memory disk with configurable sector size, used to test the
834-
/// sector shift conversion path with non-512-byte sectors.
835-
#[derive(Inspect)]
836-
struct TestDisk4K {
837-
sector_size: u32,
838-
#[inspect(skip)]
839-
storage: Mutex<Vec<u8>>,
840-
#[inspect(skip)]
841-
supports_discard: bool,
842-
}
843-
844-
impl TestDisk4K {
845-
fn new(total_bytes: usize, sector_size: u32) -> Self {
846-
assert!(sector_size.is_power_of_two() && sector_size >= 512);
847-
assert_eq!(total_bytes % sector_size as usize, 0);
848-
Self {
849-
sector_size,
850-
storage: Mutex::new(vec![0u8; total_bytes]),
851-
supports_discard: false,
852-
}
853-
}
854-
855-
fn with_discard(mut self) -> Self {
856-
self.supports_discard = true;
857-
self
858-
}
859-
}
860-
861-
impl DiskIo for TestDisk4K {
862-
fn disk_type(&self) -> &str {
863-
"test-4k"
864-
}
865-
866-
fn sector_count(&self) -> u64 {
867-
self.storage.lock().len() as u64 / self.sector_size as u64
868-
}
869-
870-
fn sector_size(&self) -> u32 {
871-
self.sector_size
872-
}
873-
874-
fn disk_id(&self) -> Option<[u8; 16]> {
875-
None
876-
}
877-
878-
fn physical_sector_size(&self) -> u32 {
879-
self.sector_size
880-
}
881-
882-
fn is_fua_respected(&self) -> bool {
883-
false
884-
}
885-
886-
fn is_read_only(&self) -> bool {
887-
false
888-
}
889-
890-
async fn read_vectored(
891-
&self,
892-
buffers: &RequestBuffers<'_>,
893-
sector: u64,
894-
) -> Result<(), DiskError> {
895-
let offset = sector as usize * self.sector_size as usize;
896-
let end = offset + buffers.len();
897-
let storage = self.storage.lock();
898-
if end > storage.len() {
899-
return Err(DiskError::IllegalBlock);
900-
}
901-
buffers.writer().write(&storage[offset..end])?;
902-
Ok(())
903-
}
904-
905-
async fn write_vectored(
906-
&self,
907-
buffers: &RequestBuffers<'_>,
908-
sector: u64,
909-
_fua: bool,
910-
) -> Result<(), DiskError> {
911-
let offset = sector as usize * self.sector_size as usize;
912-
let end = offset + buffers.len();
913-
let mut storage = self.storage.lock();
914-
if end > storage.len() {
915-
return Err(DiskError::IllegalBlock);
916-
}
917-
buffers.reader().read(&mut storage[offset..end])?;
918-
Ok(())
919-
}
920-
921-
async fn sync_cache(&self) -> Result<(), DiskError> {
922-
Ok(())
923-
}
924-
925-
async fn unmap(
926-
&self,
927-
_sector: u64,
928-
_count: u64,
929-
_block_level_only: bool,
930-
) -> Result<(), DiskError> {
931-
Ok(())
932-
}
933-
934-
fn unmap_behavior(&self) -> disk_backend::UnmapBehavior {
935-
if self.supports_discard {
936-
disk_backend::UnmapBehavior::Unspecified
937-
} else {
938-
disk_backend::UnmapBehavior::Ignored
939-
}
940-
}
941-
}
942-
943824
// --- Sector shift regression tests ---
944825

945826
/// Write and read via a 4096-byte-sector disk to exercise the sector shift
@@ -954,7 +835,7 @@ impl DiskIo for TestDisk4K {
954835
#[async_test]
955836
async fn write_read_4k_sector_disk(driver: DefaultDriver) {
956837
// 64 KiB disk with 4096-byte sectors → 16 disk sectors.
957-
let disk = Disk::new(TestDisk4K::new(64 * 1024, 4096)).unwrap();
838+
let disk = disklayer_ram::ram_disk_with_sector_size(64 * 1024, false, 4096).unwrap();
958839
let mut harness = TestHarness::new(&driver, disk, false);
959840
harness.enable();
960841

@@ -992,7 +873,7 @@ async fn write_read_4k_sector_disk(driver: DefaultDriver) {
992873
#[async_test]
993874
async fn sector_shift_multiple_offsets_4k(driver: DefaultDriver) {
994875
// 128 KiB disk with 4096-byte sectors → 32 disk sectors.
995-
let disk = Disk::new(TestDisk4K::new(128 * 1024, 4096)).unwrap();
876+
let disk = disklayer_ram::ram_disk_with_sector_size(128 * 1024, false, 4096).unwrap();
996877
let mut harness = TestHarness::new(&driver, disk, false);
997878
harness.enable();
998879

@@ -1055,7 +936,7 @@ async fn check_discard(
1055936
}
1056937

1057938
fn test_disk_4k_discard() -> Disk {
1058-
Disk::new(TestDisk4K::new(64 * 1024, 4096).with_discard()).unwrap()
939+
disklayer_ram::ram_disk_with_sector_size(64 * 1024, false, 4096).unwrap()
1059940
}
1060941

1061942
/// Discard with properly aligned sector and num_sectors on a 4K disk

0 commit comments

Comments
 (0)