From 21a9ce8e53224100f331d9a666bc00c630964724 Mon Sep 17 00:00:00 2001 From: Chuyan Zhang Date: Sun, 3 Dec 2023 00:44:48 -0800 Subject: fix directory entry counting --- ayafs-core/src/memory/dir_entry.rs | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) (limited to 'ayafs-core/src/memory/dir_entry.rs') diff --git a/ayafs-core/src/memory/dir_entry.rs b/ayafs-core/src/memory/dir_entry.rs index ee363b2..9a11d2a 100644 --- a/ayafs-core/src/memory/dir_entry.rs +++ b/ayafs-core/src/memory/dir_entry.rs @@ -72,6 +72,7 @@ impl AyaFS { parent_inode: &mut Inode, dir_entry_map: IndexMap, ) -> Result<(), c_int> { + parent_inode.size = dir_entry_map.len() as u64; for (entry_index, (name, dir_entry)) in dir_entry_map.into_iter().enumerate() { let block_index_within_inode = entry_index / 15; let entry_index_within_block = entry_index % 15; @@ -117,32 +118,36 @@ impl AyaFS { new_parent_inode: &mut Inode, new_name: T, ) -> Result<(), c_int> { + let name: &OsStr = name.as_ref(); + let new_name: &OsStr = new_name.as_ref(); self.load_direntry_map(parent_index, parent_inode)?; self.load_direntry_map(new_parent_index, new_parent_inode)?; + if parent_index != new_parent_index { + parent_inode.size -= 1; + new_parent_inode.size += 1; + } + let dir_entry = self .dir_entry_map .get(&parent_index) .ok_or(ENOENT)? - .get(name.as_ref()) + .get(name) .cloned() .ok_or(ENOENT)?; let new_dir_entry = self .dir_entry_map .get(&new_parent_index) .ok_or(ENOENT)? - .get(new_name.as_ref()) + .get(new_name) .cloned() .ok_or(ENOENT)?; - let name: &OsStr = name.as_ref(); - let new_name: &OsStr = new_name.as_ref(); - self.dir_entry_map .get_mut(&parent_index) .map(|dir_entry_map| { if let Occupied(mut entry) = dir_entry_map.entry(name.to_os_string()) { - *entry.get_mut() = new_dir_entry.clone(); + *entry.get_mut() = new_dir_entry; } }) .ok_or(ENOENT)?; @@ -150,7 +155,7 @@ impl AyaFS { .get_mut(&new_parent_index) .map(|new_dir_entry_map| { if let Occupied(mut entry) = new_dir_entry_map.entry(new_name.to_os_string()) { - *entry.get_mut() = dir_entry.clone(); + *entry.get_mut() = dir_entry; } }) .ok_or(ENOENT)?; @@ -164,12 +169,12 @@ impl AyaFS { parent_index: usize, parent_inode: &mut Inode, name: T, - _entry_index: u32, ) -> Result<(), c_int> { self.load_direntry_map(parent_index, parent_inode)?; if let Some(dir_entry_map) = self.dir_entry_map.get_mut(&parent_index) { - trace!(" remove_direntry(ino: {}) using hashmap", parent_index); if dir_entry_map.shift_remove(name.as_ref()).is_some() { + parent_inode.size = dir_entry_map.len() as u64; + // trace!("remove_direntry(parent: {:#x}, name: {:?}), parent inode size is {}, direntry_map size is {}", parent_index, name.as_ref(), parent_inode.size, dir_entry_map.len()); Ok(()) } else { Err(ENOENT) @@ -191,11 +196,9 @@ impl AyaFS { if let Some(dir_entry_map) = self.dir_entry_map.get_mut(&parent_index) { let (entry_index, _) = dir_entry_map.insert_full(child_inode_name.to_os_string(), dir_entry); - trace!( - " add_direntry(ino: {}) using hashmap, entry {}", - parent_index, entry_index - ); - parent_inode.size += 1; + // trace!("parent inode size {} before +1", parent_inode.size); + parent_inode.size = dir_entry_map.len() as u64; + // trace!("add_direntry_2(parent: {:#x}, name: {:?}), parent inode size is {}, direntry_map size is {}", parent_index, child_inode_name, parent_inode.size, dir_entry_map.len()); Ok(entry_index as u32) } else { Err(ENOENT) @@ -227,11 +230,8 @@ impl AyaFS { let (entry_index, _) = dir_entry_map.insert_full(child_inode_name.to_os_string(), dir_entry); - trace!( - " add_direntry(ino: {}) using hashmap, entry {}", - parent_index, entry_index - ); - parent_inode.size += 1; + parent_inode.size = dir_entry_map.len() as u64; + trace!("add_direntry(parent: {:#x}, name: {:?}), parent inode size is {}, direntry_map size is {}", parent_index, child_inode_name, parent_inode.size, dir_entry_map.len()); Ok(entry_index as u32) } else { Err(ENOENT) -- cgit v1.2.3-70-g09d2