//! Real block completion with a fault-injected short used length at the VFS bridge. use super::*; use turkos_kernel::runtime::syscall_abi::Errno; pub fn run(boot: &BootData, allocator: &mut memory::FrameAllocator) -> Result<(), &'static str> { let before = allocator.remaining_pages(); let mut disk = virtio_ro_turkfs::RoDisk::open( boot, allocator, "TURKOS/OS/K1520-GET")?; if disk.capacity() != 2048 { return Err("k1520-disk-capacity"); } let mut destination = [0xa5u8; 512]; if k1290_cat_disk::CatDisk::inject_short_sector_for_vfs( &mut disk, 0, &mut destination) != Err(Errno::Io) || destination.iter().any(|&byte| byte != 0xa5) { return Err("k1520-short-VFS-boundary"); } disk.close_after_timeout(allocator)?; if allocator.remaining_pages() != before { return Err("k1520-short-frame-leak"); } let mut healthy = virtio_ro_turkfs::RoDisk::open( boot, allocator, "TURKOS/OS/K1520-GET")?; let mut good = [0xa5u8; 512]; k1290_cat_disk::CatDisk::read_sector_for_vfs(&mut healthy, 1, &mut good) .map_err(|_| "k1520-healthy-VFS-read")?; if good.iter().any(|&byte| byte != 0) { return Err("k1520-healthy-data"); } healthy.close(allocator)?; if allocator.remaining_pages() != before { return Err("k1520-healthy-frame-leak"); } write_line("TURKOS/OS/K1520-BLOCK-ERROR: USED_INJECTED=257 VFS=EIO DEST=UNCHANGED RESET=ACK FRAMES=RETURNED FRESH=OK"); Ok(()) }