diff --git a/Cargo.toml b/Cargo.toml index 3fb711a3d01cc27e9358c79d0ddf616a85a73da9..215f8ccc649894008538b5fcb93fcc11eeb0e50b 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.4.0" +version = "0.4.1" license-file = "LICENSE" readme = "README.md" authors = ["Jeremy Soller <jackpot51@gmail.com>"] diff --git a/src/mount/fuse.rs b/src/mount/fuse.rs index b7ec66ae5fa06ce7d7807e79f94e9dc44809bee9..3ae71fdac6bd4606db9d6eaac155b6f97f933b95 100644 --- a/src/mount/fuse.rs +++ b/src/mount/fuse.rs @@ -493,4 +493,38 @@ impl<D: Disk> Filesystem for Fuse<D> { } } } + + fn rename(&mut self, _req: &Request, orig_parent: u64, name: &OsStr, new_parent: u64, new_name: &OsStr, reply: ReplyEmpty) { + let rename_inner = |fs: &mut filesystem::FileSystem<D>| -> syscall::Result<()> { + let mut orig = fs.find_node(name.to_str().unwrap(), orig_parent)?; + + if new_parent != orig_parent { + fs.remove_blocks(orig.0, 1, orig_parent)?; + } + + if let Ok(node) = fs.find_node(new_name.to_str().unwrap(), new_parent) { + if node.0 != orig.0 { + fs.node_set_len(node.0, 0)?; + fs.remove_blocks(node.0, 1, new_parent)?; + fs.write_at(node.0, &Node::default())?; + fs.deallocate(node.0, BLOCK_SIZE)?; + } + } + + orig.1.set_name(&new_name.to_str().unwrap())?; + orig.1.parent = new_parent; + fs.write_at(orig.0, &orig.1)?; + + if new_parent != orig_parent { + fs.insert_blocks(orig.0, BLOCK_SIZE, new_parent)?; + } + + Ok(()) + }; + + match rename_inner(&mut self.fs) { + Ok(()) => reply.ok(), + Err(err) => reply.error(err.errno as i32), + } + } } diff --git a/src/mount/redox/scheme.rs b/src/mount/redox/scheme.rs index d12398cbdb520f52559b3e235de9554169e98a57..1ea47d257ea473969d53a3e8cf67cd8a6dea5b2a 100644 --- a/src/mount/redox/scheme.rs +++ b/src/mount/redox/scheme.rs @@ -632,15 +632,10 @@ impl<D: Disk> Scheme for FileScheme<D> { let orig_parent = orig.1.parent; - orig.1.set_name(&last_part)?; - orig.1.parent = parent.0; - if parent.0 != orig_parent { fs.remove_blocks(orig.0, 1, orig_parent)?; } - fs.write_at(orig.0, &orig.1)?; - if let Some(node) = node_opt { if node.0 != orig.0 { fs.node_set_len(node.0, 0)?; @@ -650,6 +645,10 @@ impl<D: Disk> Scheme for FileScheme<D> { } } + orig.1.set_name(&last_part)?; + orig.1.parent = parent.0; + fs.write_at(orig.0, &orig.1)?; + if parent.0 != orig_parent { fs.insert_blocks(orig.0, BLOCK_SIZE, parent.0)?; }