//! Serialized synthetic rename with directory cycle refusal. 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 ns = Namespace::<4>::new(2).map_err(|_| "k1650-namespace")?; let file = ns.create(1, b"old", Kind::File).map_err(|_| "k1650-file")?; let directory = ns.create(1, b"dir", Kind::Directory).map_err(|_| "k1650-directory")?; let bits = ns.allocated_bits(); ns.rename(1, b"old", directory, b"new").map_err(|_| "k1650-rename")?; if file != 2 || ns.lookup(1, b"old").is_some() || ns.lookup(directory, b"new").map(|entry| entry.inode) != Some(file) { return Err("k1650-publication"); } write_line("TURKOS/OS/K1650-RENAME: OLD=ABSENT NEW=INODE2"); if ns.allocated_bits() != bits || ns.used() != 2 { return Err("k1650-bitmap"); } write_line("TURKOS/OS/K1650-RENAME: BITS=UNCHANGED"); let mut tree = Namespace::<4>::new(4).map_err(|_| "k1650-tree")?; let parent = tree.create(1, b"parent", Kind::Directory).map_err(|_| "k1650-parent")?; let child = tree.create(parent, b"child", Kind::Directory).map_err(|_| "k1650-child")?; let leaf = tree.create(child, b"leaf", Kind::Directory).map_err(|_| "k1650-leaf")?; let before = tree; if tree.rename(1, b"parent", parent, b"self") != Err(Error::Cycle) || tree != before || tree.rename(1, b"parent", leaf, b"cycle") != Err(Error::Cycle) || tree != before || tree.lookup(leaf, b"cycle").is_some() { return Err("k1650-cycle"); } write_line("TURKOS/OS/K1650-RENAME: CYCLE=UNCHANGED"); if allocator.remaining_pages() != frames_before { return Err("k1650-frames"); } write_line("TURKOS/OS/K1650-RENAME: FRAMES=UNCHANGED"); Ok(()) }