//! Transactional metadata growth from one to three separate blocks. use super::*; use os_turkfs_allocation::{Bitmap, Error, ExtentFile}; const RESERVED: u64 = 0x1f; pub fn run(allocator: &mut memory::FrameAllocator) -> Result<(), &'static str> { let frames_before = allocator.remaining_pages(); let all = (1u64 << 32) - 1; let mut bitmap = Bitmap::validate(32, RESERVED, all & !(1u64 << 20) & !(1u64 << 30)) .map_err(|_| "k1630-valid-bitmap")?; let mut file = ExtentFile::one_block(10, &bitmap) .map_err(|_| "k1630-valid-file")?; if file.grow_to_three(&mut bitmap) != Ok(()) || file.count() != 3 || file.blocks() != [10, 20, 30] || bitmap.counts().free != 0 { return Err("k1630-grow"); } write_line("TURKOS/OS/K1630-GROW: EXTENTS=10,20,30"); let mut limited = Bitmap::validate(32, RESERVED, all & !(1u64 << 20)) .map_err(|_| "k1630-limited-bitmap")?; let mut old = ExtentFile::one_block(10, &limited) .map_err(|_| "k1630-old-file")?; let limited_before = limited; let old_before = old; if old.grow_to_three(&mut limited) != Err(Error::NoSpace) { return Err("k1630-no-space"); } write_line("TURKOS/OS/K1630-GROW: SECOND=ENOSPC"); if old != old_before || limited != limited_before || old.blocks()[0] != 10 || old.count() != 1 { return Err("k1630-rollback"); } write_line("TURKOS/OS/K1630-GROW: OLD-INODE-BITMAP=UNCHANGED"); if allocator.remaining_pages() != frames_before { return Err("k1630-frames"); } write_line("TURKOS/OS/K1630-GROW: FRAMES=UNCHANGED"); Ok(()) }