diff --git a/Cargo.toml b/Cargo.toml index df5e27bcca..2ebf671814 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ name = "redoxfs" description = "The Redox Filesystem" repository = "https://gitlab.redox-os.org/redox-os/redoxfs" -version = "0.8.5" +version = "0.8.6" license-file = "LICENSE" readme = "README.md" authors = ["Jeremy Soller "] diff --git a/src/mount/redox/resource.rs b/src/mount/redox/resource.rs index 295421feed..992722f722 100644 --- a/src/mount/redox/resource.rs +++ b/src/mount/redox/resource.rs @@ -493,6 +493,11 @@ impl Resource for FileResource { let fmap_info = fmaps .get_mut(&self.node_ptr.id()) .ok_or(Error::new(EBADFD))?; + + if !fmap_info.in_use() { + // Notify filesystem of open + tx.on_open_node(self.node_ptr)?; + } let new_size = (offset as usize + aligned_size).next_multiple_of(PAGE_SIZE); if new_size > fmap_info.size { @@ -602,8 +607,10 @@ impl Resource for FileResource { // Notify filesystem of close tx.on_close_node(self.node_ptr)?; + /*TODO: leaks memory, but why? // Remove from fmaps list fmaps.remove(&self.node_ptr.id()); + */ } Ok(()) diff --git a/src/mount/redox/scheme.rs b/src/mount/redox/scheme.rs index b258b2c3e4..a483b5389d 100644 --- a/src/mount/redox/scheme.rs +++ b/src/mount/redox/scheme.rs @@ -335,14 +335,16 @@ impl<'sock, D: Disk> FileScheme<'sock, D> { }; let node_ptr = resource.node_ptr(); - self.fmap - .entry(node_ptr.id()) - .or_insert_with(|| { + { + let fmap_info = self.fmap + .entry(node_ptr.id()) + .or_insert_with(FileMmapInfo::new); + if !fmap_info.in_use() { // Notify filesystem of open - self.fs.tx(|tx| tx.on_open_node(node_ptr)).unwrap(); - FileMmapInfo::new() - }) - .open_fds += 1; + self.fs.tx(|tx| tx.on_open_node(node_ptr))?; + } + fmap_info.open_fds += 1; + } let id = self.next_id.fetch_add(1, Ordering::Relaxed); self.files.insert(id, resource); @@ -929,8 +931,10 @@ impl<'sock, D: Disk> SchemeSync for FileScheme<'sock, D> { log::error!("failed to close node {}: {}", node_ptr.id(), err); } + /*TODO: leaks memory, but why? // Remove from fmap list self.fmap.remove(&node_ptr.id()); + */ } } @@ -1026,14 +1030,16 @@ impl<'sock, D: Disk> SchemeSync for FileScheme<'sock, D> { }; let node_ptr = resource.node_ptr(); - self.fmap - .entry(node_ptr.id()) - .or_insert_with(|| { + { + let fmap_info = self.fmap + .entry(node_ptr.id()) + .or_insert_with(FileMmapInfo::new); + if !fmap_info.in_use() { // Notify filesystem of open - self.fs.tx(|tx| tx.on_open_node(node_ptr)).unwrap(); - FileMmapInfo::new() - }) - .open_fds += 1; + self.fs.tx(|tx| tx.on_open_node(node_ptr))?; + } + fmap_info.open_fds += 1; + } let id = self.next_id.fetch_add(1, Ordering::Relaxed); self.files.insert(id, resource);