//! Two independent read-only opens and a write/create refusal. use super::*; use os_vfs_lookup::{LookupTable, Mount}; use os_vfs_open::{Error as OpenError, OpenFlags, OpenTable}; pub fn run(allocator: &mut memory::FrameAllocator) -> Result<(), &'static str> { let frames_before = allocator.remaining_pages(); let first = Mount::new(1, 11, b"dosya").map_err(|_| "k1565-first")?; let second = Mount::new(2, 22, b"dosya").map_err(|_| "k1565-second")?; let lookup = LookupTable::new(first, second).map_err(|_| "k1565-lookup")?; let dentry = lookup.lookup(1, b"dosya").map_err(|_| "k1565-dentry")?; let mut opens = OpenTable::new(); let one = opens.open(&lookup, dentry, OpenFlags::READ_ONLY) .map_err(|_| "k1565-open-one")?; let two = opens.open(&lookup, dentry, OpenFlags::READ_ONLY) .map_err(|_| "k1565-open-two")?; if one.id != 1 || two.id != 2 || one.id == two.id || one.inode != 11 || two.inode != 11 || opens.active_handles() != 2 { return Err("k1565-independent"); } let before = opens; let write_create = OpenFlags { read: true, write: true, create: true }; if opens.open(&lookup, dentry, write_create) != Err(OpenError::Erofs) || opens != before || opens.active_handles() != 2 || allocator.remaining_pages() != frames_before { return Err("k1565-erofs"); } opens.close(one).map_err(|_| "k1565-close-one")?; opens.close(two).map_err(|_| "k1565-close-two")?; if opens.active_handles() != 0 || allocator.remaining_pages() != frames_before { return Err("k1565-close-count"); } write_line("TURKOS/OS/K1565-OPEN: READS=2 EROFS=WRITE_CREATE HANDLES=UNCHANGED FRAMES=UNCHANGED"); Ok(()) }