//! Real OUT/FLUSH ordering on the host-created disposable disk. use super::*; use os_turkfs_journal_ordering::{Error, State, Writer}; pub fn run(boot: &BootData, allocator: &mut memory::FrameAllocator) -> Result<(), &'static str> { let frames_before = allocator.remaining_pages(); let mut writer = Writer::new(); if writer.publish() != Err(Error::Order) || writer.state() != State::Start { return Err("k1670-early-publication"); } write_line("TURKOS/OS/K1670-ORDER: EARLY-PUBLISH=REJECTED"); let mut disk = k1670_virtio_journal::Disk::open(boot, allocator).map_err(|_| "k1670-open")?; let result = (|| { let mut control = [0u8; 512]; disk.read(111, &mut control).map_err(|_| "k1670-control-read")?; if &control[..16] != b"K1670DISPOSABLE!" { return Err("k1670-disposable-marker"); } let data = [0x44u8; 512]; let mut log = [0u8; 512]; log[..128].copy_from_slice(include_bytes!("k1665-journal.bin")); os_turkfs_journal::parse(&log[..128], 2048, 7).map_err(|_| "k1670-log")?; let mut commit = [0u8; 512]; commit[..8].copy_from_slice(b"TKCOMMIT"); commit[8..16].copy_from_slice(&7u64.to_le_bytes()); commit[16..20].copy_from_slice(&0x62725158u32.to_le_bytes()); commit[32..64].copy_from_slice(&turkos_kernel::turkfs::file_sha256(&data)); writer.execute(&mut disk, &data, &log, &commit).map_err(|_| "k1670-io-order")?; if !writer.published() { return Err("k1670-publication"); } write_line("TURKOS/OS/K1670-ORDER: DATA-FLUSH LOG-FLUSH COMMIT-FLUSH PUBLISHED"); let mut observed = [0u8; 512]; for (lba, expected) in [(120, &data), (112, &log), (113, &commit)] { disk.read(lba, &mut observed).map_err(|_| "k1670-readback")?; if &observed != expected { return Err("k1670-readback-bytes"); } } write_line("TURKOS/OS/K1670-ORDER: READBACK=3 MATCH"); Ok(()) })(); let closed = disk.close(allocator).map_err(|_| "k1670-reset"); result?; closed?; if allocator.remaining_pages() != frames_before { return Err("k1670-frames"); } write_line("TURKOS/OS/K1670-ORDER: FRAMES=UNCHANGED"); Ok(()) }