//! Bounded owner-scoped RAM filesystem guest probe. use super::*; use os_vfs_tmpfs::{Error, Tmpfs}; pub fn run(allocator: &mut memory::FrameAllocator) -> Result<(), &'static str> { let frames_before = allocator.remaining_pages(); let mut fs = Tmpfs::new(7, 8).map_err(|_| "k1590-new")?; let first = fs.create(11, b"a").map_err(|_| "k1590-create-a")?; if fs.write_at(11, first, 0, b"abc") != Ok(3) || fs.write_at(11, first, 5, b"XY") != Ok(2) || fs.len(11, first) != Ok(7) { return Err("k1590-write-gap"); } let mut output = [b'!'; 8]; if fs.read_at(11, first, 0, &mut output) != Ok(7) || output != [b'a', b'b', b'c', 0, 0, b'X', b'Y', b'!'] { return Err("k1590-read-gap"); } write_line("TURKOS/OS/K1590-TMPFS: ZERO-GAP=7"); let second = fs.create(22, b"b").map_err(|_| "k1590-create-b")?; let before_quota = fs; if fs.write_at(22, second, 0, b"zz") != Err(Error::NoSpace) || fs != before_quota || fs.write_at(22, second, 0, b"z") != Ok(1) || fs.used() != 8 { return Err("k1590-quota"); } write_line("TURKOS/OS/K1590-TMPFS: QUOTA=REJECTED UNCHANGED"); let before_owner = fs; let mut canary = [b'!'; 8]; if fs.read_at(22, first, 0, &mut canary) != Err(Error::InvalidOwner) || canary != [b'!'; 8] || fs.write_at(22, first, 0, b"X") != Err(Error::InvalidOwner) || fs != before_owner { return Err("k1590-owner"); } write_line("TURKOS/OS/K1590-TMPFS: OWNER=REJECTED"); if fs.unlink(11, b"a") != Ok(()) || fs.used() != 1 || fs.len(11, first) != Err(Error::NoEntry) { return Err("k1590-unlink"); } write_line("TURKOS/OS/K1590-TMPFS: UNLINK=RECLAIMED"); if fs.reset() != Ok(8) || fs.used() != 0 || fs.len(22, second) != Err(Error::Stale) || allocator.remaining_pages() != frames_before { return Err("k1590-reset"); } write_line("TURKOS/OS/K1590-TMPFS: RESET=STALE FRAMES=UNCHANGED"); Ok(()) }