//! Reused inode slot and stale-handle refusal guest probe. use super::*; use os_turkfs_allocation::{Error, InodeSlot}; pub fn run(allocator: &mut memory::FrameAllocator) -> Result<(), &'static str> { let frames_before = allocator.remaining_pages(); let mut slot = InodeSlot::new(5, 7).map_err(|_| "k1635-slot")?; let old = slot.allocate(11).map_err(|_| "k1635-old-owner")?; if slot.owner(old) != Ok(11) || slot.release(old) != Ok(()) || slot.generation() != 8 { return Err("k1635-retire"); } let fresh = slot.allocate(22).map_err(|_| "k1635-new-owner")?; if fresh.slot != old.slot || fresh.generation != 8 { return Err("k1635-reuse"); } write_line("TURKOS/OS/K1635-INODE: REUSE=GEN8"); let before_stale = slot; if slot.owner(old) != Err(Error::Stale) || slot.release(old) != Err(Error::Stale) || slot != before_stale { return Err("k1635-stale"); } write_line("TURKOS/OS/K1635-INODE: STALE=REJECTED"); if slot.owner(fresh) != Ok(22) { return Err("k1635-new-owner-visible"); } write_line("TURKOS/OS/K1635-INODE: OWNER=22"); let mut terminal = InodeSlot::new(6, u64::MAX) .map_err(|_| "k1635-terminal")?; let handle = terminal.allocate(33).map_err(|_| "k1635-terminal-owner")?; let before_overflow = terminal; if terminal.release(handle) != Err(Error::GenerationOverflow) || terminal != before_overflow || allocator.remaining_pages() != frames_before { return Err("k1635-overflow"); } write_line("TURKOS/OS/K1635-INODE: OVERFLOW=UNCHANGED FRAMES=UNCHANGED"); Ok(()) }