diff --git a/Cargo.lock b/Cargo.lock
index 95053c3c31f1f5cca53d189e9a47194595ea1419..1e9572a30095c6a829fcf8e908f37cd593a5b05c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2,7 +2,7 @@
 name = "redoxfs"
 version = "0.2.0"
 dependencies = [
- "fuse 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "fuse 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)",
  "redox_syscall 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)",
  "spin 0.4.5 (git+https://github.com/messense/spin-rs?rev=020f1b3f)",
@@ -11,10 +11,10 @@ dependencies = [
 
 [[package]]
 name = "fuse"
-version = "0.2.8"
+version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "libc 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
  "thread-scoped 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -30,11 +30,6 @@ dependencies = [
  "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
-[[package]]
-name = "libc"
-version = "0.1.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
 [[package]]
 name = "libc"
 version = "0.2.31"
@@ -87,9 +82,8 @@ version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [metadata]
-"checksum fuse 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "adf08478eb39cff95e34daa7a2743a256d1c18388c0328d2f717e8ef748001f6"
+"checksum fuse 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5087262ce5b36fed6ccd4abf0a8224e48d055a2bb07fecb5605765de6f114a28"
 "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
-"checksum libc 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "e32a70cf75e5846d53a673923498228bbec6a8624708a9ea5645f075d6276122"
 "checksum libc 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)" = "d1419b2939a0bc44b77feb34661583c7546b532b192feab36249ab584b86856c"
 "checksum log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "880f77541efa6e5cc74e76910c9884d9859683118839d6a1dc3b11e63512565b"
 "checksum pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903"
diff --git a/Cargo.toml b/Cargo.toml
index e9631632e6e224c8dbe2efc1088e5b90aa4378c6..38f55a062e0324527a63e472ef10374d860b93ab 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -24,6 +24,6 @@ spin = { git = "https://github.com/messense/spin-rs", rev = "020f1b3f" }
 redox_syscall = "0.1"
 
 [target.'cfg(unix)'.dependencies]
-fuse = "0.2"
+fuse = "0.3"
 libc = "0.2"
 time = "0.1"
diff --git a/src/bin/mount.rs b/src/bin/mount.rs
index 564bdb726ea93afc2018e844b3260960dc541564..716d591737fc00a48a9e3ccdab83ce150d579ca7 100644
--- a/src/bin/mount.rs
+++ b/src/bin/mount.rs
@@ -61,9 +61,16 @@ fn main() {
                         Ok(filesystem) => {
                             println!("redoxfs: opened filesystem {}", path);
 
-                            if let Some(mountpoint) = env::args_os().nth(2) {
-                                mount(filesystem, &mountpoint, write);
-                                process::exit(0);
+                            if let Some(mountpoint) = env::args().nth(2) {
+                                match mount(filesystem, &mountpoint, write) {
+                                    Ok(()) => {
+                                        process::exit(0);
+                                    },
+                                    Err(err) => {
+                                        println!("redoxfs: failed to mount {} to {}: {}", path, mountpoint, err);
+                                        process::exit(1);
+                                    }
+                                }
                             } else {
                                 println!("redoxfs: no mount point provided");
                                 usage();
diff --git a/src/mount/fuse.rs b/src/mount/fuse.rs
index 0e2b8d2240c5291534dd4d5b140a810fe88b460d..2f0f2e107e5e3e867ed2e02ae0e619588b15a67d 100644
--- a/src/mount/fuse.rs
+++ b/src/mount/fuse.rs
@@ -1,8 +1,9 @@
 extern crate fuse;
 extern crate time;
 
-use std::path::Path;
+use std::ffi::OsStr;
 use std::os::unix::ffi::OsStrExt;
+use std::path::Path;
 use std::time::{SystemTime, UNIX_EPOCH};
 
 use disk::Disk;
@@ -54,7 +55,7 @@ fn node_attr(node: &(u64, Node)) -> FileAttr {
 }
 
 impl<D: Disk> Filesystem for Fuse<D> {
-    fn lookup(&mut self, _req: &Request, parent_block: u64, name: &Path, reply: ReplyEntry) {
+    fn lookup(&mut self, _req: &Request, parent_block: u64, name: &OsStr, reply: ReplyEntry) {
         match self.fs.find_node(name.to_str().unwrap(), parent_block) {
             Ok(node) => {
                 reply.entry(&TTL, &node_attr(&node), 0);
@@ -235,7 +236,7 @@ impl<D: Disk> Filesystem for Fuse<D> {
         }
     }
 
-    fn create(&mut self, _req: &Request, parent_block: u64, name: &Path, mode: u32, flags: u32, reply: ReplyCreate) {
+    fn create(&mut self, _req: &Request, parent_block: u64, name: &OsStr, mode: u32, flags: u32, reply: ReplyCreate) {
         let ctime = SystemTime::now().duration_since(UNIX_EPOCH).unwrap();
         match self.fs.create_node(Node::MODE_FILE | (mode as u16 & Node::MODE_PERM), name.to_str().unwrap(), parent_block, ctime.as_secs(), ctime.subsec_nanos()) {
             Ok(node) => {
@@ -248,7 +249,7 @@ impl<D: Disk> Filesystem for Fuse<D> {
         }
     }
 
-    fn mkdir(&mut self, _req: &Request, parent_block: u64, name: &Path, mode: u32, reply: ReplyEntry) {
+    fn mkdir(&mut self, _req: &Request, parent_block: u64, name: &OsStr, mode: u32, reply: ReplyEntry) {
         let ctime = SystemTime::now().duration_since(UNIX_EPOCH).unwrap();
         match self.fs.create_node(Node::MODE_DIR | (mode as u16 & Node::MODE_PERM), name.to_str().unwrap(), parent_block, ctime.as_secs(), ctime.subsec_nanos()) {
             Ok(node) => {
@@ -261,7 +262,7 @@ impl<D: Disk> Filesystem for Fuse<D> {
         }
     }
 
-    fn rmdir(&mut self, _req: &Request, parent_block: u64, name: &Path, reply: ReplyEmpty) {
+    fn rmdir(&mut self, _req: &Request, parent_block: u64, name: &OsStr, reply: ReplyEmpty) {
         match self.fs.remove_node(Node::MODE_DIR, name.to_str().unwrap(), parent_block) {
             Ok(()) => {
                 reply.ok();
@@ -272,7 +273,7 @@ impl<D: Disk> Filesystem for Fuse<D> {
         }
     }
 
-    fn unlink(&mut self, _req: &Request, parent_block: u64, name: &Path, reply: ReplyEmpty) {
+    fn unlink(&mut self, _req: &Request, parent_block: u64, name: &OsStr, reply: ReplyEmpty) {
         match self.fs.remove_node(Node::MODE_FILE, name.to_str().unwrap(), parent_block) {
             Ok(()) => {
                 reply.ok();
@@ -298,7 +299,7 @@ impl<D: Disk> Filesystem for Fuse<D> {
         }
     }
 
-    fn symlink(&mut self, _req: &Request, parent_block: u64, name: &Path, link: &Path, reply: ReplyEntry) {
+    fn symlink(&mut self, _req: &Request, parent_block: u64, name: &OsStr, link: &Path, reply: ReplyEntry) {
         let ctime = SystemTime::now().duration_since(UNIX_EPOCH).unwrap();
         match self.fs.create_node(Node::MODE_SYMLINK | 0o777, name.to_str().unwrap(), parent_block, ctime.as_secs(), ctime.subsec_nanos()) {
             Ok(node) => {
diff --git a/src/mount/mod.rs b/src/mount/mod.rs
index d8dfb1fe94059624eda9b4fb89f6a2aa5fc586e5..1324ba441b22482c3830fbc610619e0a22ff9003 100644
--- a/src/mount/mod.rs
+++ b/src/mount/mod.rs
@@ -1,3 +1,4 @@
+use std::io;
 use std::fs::File;
 use std::path::Path;
 
@@ -11,7 +12,7 @@ mod fuse;
 mod redox;
 
 #[cfg(all(unix, target_os = "macos"))]
-pub fn mount<D: Disk, P: AsRef<Path>>(filesystem: FileSystem<D>, mountpoint: &P, mut write: File) {
+pub fn mount<D: Disk, P: AsRef<Path>>(filesystem: FileSystem<D>, mountpoint: &P, mut write: File) -> io::Result<()> {
     use std::ffi::OsStr;
     use std::io::Write;
 
@@ -27,11 +28,11 @@ pub fn mount<D: Disk, P: AsRef<Path>>(filesystem: FileSystem<D>, mountpoint: &P,
         // be `root`, thus that we need to allow `root` to have access.
         OsStr::new("-o"),
         OsStr::new("defer_permissions"),
-    ]);
+    ])
 }
 
 #[cfg(all(unix, not(target_os = "macos")))]
-pub fn mount<D: Disk, P: AsRef<Path>>(filesystem: FileSystem<D>, mountpoint: &P, mut write: File) {
+pub fn mount<D: Disk, P: AsRef<Path>>(filesystem: FileSystem<D>, mountpoint: &P, mut write: File) -> io::Result<()> {
     use std::io::Write;
 
     let _ = write.write(&[0]);
@@ -39,10 +40,10 @@ pub fn mount<D: Disk, P: AsRef<Path>>(filesystem: FileSystem<D>, mountpoint: &P,
 
     fuse::mount(fuse::Fuse {
         fs: filesystem
-    }, mountpoint, &[]);
+    }, mountpoint, &[])
 }
 
 #[cfg(target_os = "redox")]
-pub fn mount<D: Disk, P: AsRef<Path>>(filesystem: FileSystem<D>, mountpoint: &P, write: File) {
-    redox::mount(filesystem, mountpoint, write);
+pub fn mount<D: Disk, P: AsRef<Path>>(filesystem: FileSystem<D>, mountpoint: &P, write: File) -> io::Result<()> {
+    redox::mount(filesystem, mountpoint, write)
 }
diff --git a/src/mount/redox/mod.rs b/src/mount/redox/mod.rs
index 9cd42b4e822acdb8ea2c67dcf0992d5d9206d1a3..985f7929d2aae3e42196a1cf778f3fedb7e6bfdd 100644
--- a/src/mount/redox/mod.rs
+++ b/src/mount/redox/mod.rs
@@ -2,7 +2,7 @@ extern crate spin;
 
 use syscall::{Packet, Scheme};
 use std::fs::File;
-use std::io::{Read, Write};
+use std::io::{self, Read, Write};
 use std::path::Path;
 
 use self::scheme::FileScheme;
@@ -10,23 +10,22 @@ use self::scheme::FileScheme;
 pub mod resource;
 pub mod scheme;
 
-pub fn mount<P: AsRef<Path>>(filesystem: filesystem::FileSystem, mountpoint: &P, mut write: File) {
+pub fn mount<P: AsRef<Path>>(filesystem: filesystem::FileSystem, mountpoint: &P, mut write: File) -> io::Result<()> {
     let mountpoint = mountpoint.as_ref();
-    match File::create(format!(":{}", mountpoint.display())) {
-        Ok(mut socket) => {
-            println!("redoxfs: mounted filesystem on {}:", mountpoint.display());
-
-            let _ = write.write(&[0]);
-            drop(write);
-
-            let scheme = FileScheme::new(format!("{}", mountpoint.display()), filesystem);
-            loop {
-                let mut packet = Packet::default();
-                socket.read(&mut packet).unwrap();
-                scheme.handle(&mut packet);
-                socket.write(&packet).unwrap();
-            }
-        },
-        Err(err) => println!("redoxfs: failed to create {} scheme: {}", mountpoint.display(), err)
+    let mut socket = File::create(format!(":{}", mountpoint.display()))?;
+
+    println!("redoxfs: mounted filesystem on {}:", mountpoint.display());
+
+    let _ = write.write(&[0]);
+    drop(write);
+
+    let scheme = FileScheme::new(format!("{}", mountpoint.display()), filesystem);
+    loop {
+        let mut packet = Packet::default();
+        socket.read(&mut packet).unwrap();
+        scheme.handle(&mut packet);
+        socket.write(&packet).unwrap();
     }
+
+    Ok(())
 }