//! Serialized synthetic namespace creation and transaction rollback. use super::*; use os_turkfs_namespace::{Error, Kind, Namespace}; pub fn run(allocator: &mut memory::FrameAllocator) -> Result<(), &'static str> { let frames_before = allocator.remaining_pages(); let mut namespace = Namespace::<4>::new(4).map_err(|_| "k1645-namespace")?; let directory = namespace.create(1, b"docs", Kind::Directory) .map_err(|_| "k1645-directory")?; let file = namespace.create(directory, b"readme", Kind::File) .map_err(|_| "k1645-file")?; if directory != 2 || file != 3 || namespace.allocated_bits() != 15 || namespace.used() != 2 || namespace.lookup(1, b"docs").map(|entry| entry.kind) != Some(Kind::Directory) || namespace.lookup(directory, b"readme").map(|entry| entry.inode) != Some(file) || namespace.lookup(1, b"readme").is_some() { return Err("k1645-publication"); } write_line("TURKOS/OS/K1645-CREATE: DIR=2 FILE=3 BITS=0F"); let before = namespace; if namespace.create(1, b"docs", Kind::File) != Err(Error::Exists) || namespace != before { return Err("k1645-duplicate"); } write_line("TURKOS/OS/K1645-CREATE: DUPLICATE=UNCHANGED"); let mut limited = Namespace::<4>::new(1).map_err(|_| "k1645-limited")?; let parent = limited.create(1, b"docs", Kind::Directory) .map_err(|_| "k1645-limited-parent")?; let before_quota = limited; if limited.create(parent, b"hidden", Kind::File) != Err(Error::Quota) || limited != before_quota || limited.lookup(parent, b"hidden").is_some() || limited.allocated_bits() != 7 { return Err("k1645-quota"); } write_line("TURKOS/OS/K1645-CREATE: QUOTA=UNCHANGED PARTIAL=ABSENT"); if namespace.allocated_bits().count_ones() as usize != namespace.used() + 2 || limited.allocated_bits().count_ones() as usize != limited.used() + 2 || allocator.remaining_pages() != frames_before { return Err("k1645-ownership"); } write_line("TURKOS/OS/K1645-CREATE: OWNER=BALANCED FRAMES=UNCHANGED"); Ok(()) }