diff --git a/Cargo.lock b/Cargo.lock
index de9fe5906bd1fdc044609efb37beb4f32abbd1e4..fc036af18cfc068a682cedc60cea36b85cf45358 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -71,7 +71,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "redoxfs"
-version = "0.3.0"
+version = "0.3.1"
 dependencies = [
  "fuse 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
diff --git a/Cargo.toml b/Cargo.toml
index a5bf0051f5f667ca3a63e64f017868f8bbdc8978..f285af56953a78c64f8484bad2f3eb892121d7f2 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -2,7 +2,7 @@
 name = "redoxfs"
 description = "The Redox Filesystem"
 repository = "https://github.com/redox-os/redoxfs"
-version = "0.3.0"
+version = "0.3.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 bdfab5b307f9b6aa0aa549ffed388e6e8351438a..4b03fed0a611b9f55bac985c98daa77091b1f631 100644
--- a/src/mount/fuse.rs
+++ b/src/mount/fuse.rs
@@ -1,6 +1,7 @@
 extern crate fuse;
 extern crate time;
 
+use std::cmp;
 use std::ffi::OsStr;
 use std::io;
 use std::os::unix::ffi::OsStrExt;
@@ -175,9 +176,9 @@ impl<D: Disk> Filesystem for Fuse<D> {
         }
     }
 
-    fn read(&mut self, _req: &Request, block: u64, _fh: u64, offset: u64, size: u32, reply: ReplyData) {
+    fn read(&mut self, _req: &Request, block: u64, _fh: u64, offset: i64, size: u32, reply: ReplyData) {
         let mut data = vec![0; size as usize];
-        match self.fs.read_node(block, offset, &mut data) {
+        match self.fs.read_node(block, cmp::max(0, offset) as u64, &mut data) {
             Ok(count) => {
                 reply.data(&data[..count]);
             },
@@ -187,9 +188,9 @@ impl<D: Disk> Filesystem for Fuse<D> {
         }
     }
 
-    fn write(&mut self, _req: &Request, block: u64, _fh: u64, offset: u64, data: &[u8], _flags: u32, reply: ReplyWrite) {
+    fn write(&mut self, _req: &Request, block: u64, _fh: u64, offset: i64, data: &[u8], _flags: u32, reply: ReplyWrite) {
         let mtime = SystemTime::now().duration_since(UNIX_EPOCH).unwrap();
-        match self.fs.write_node(block, offset, &data, mtime.as_secs(), mtime.subsec_nanos()) {
+        match self.fs.write_node(block, cmp::max(0, offset) as u64, &data, mtime.as_secs(), mtime.subsec_nanos()) {
             Ok(count) => {
                 reply.written(count as u32);
             },
@@ -207,7 +208,7 @@ impl<D: Disk> Filesystem for Fuse<D> {
         reply.ok();
     }
 
-    fn readdir(&mut self, _req: &Request, parent_block: u64, _fh: u64, offset: u64, mut reply: ReplyDirectory) {
+    fn readdir(&mut self, _req: &Request, parent_block: u64, _fh: u64, offset: i64, mut reply: ReplyDirectory) {
         let mut children = Vec::new();
         match self.fs.child_nodes(&mut children, parent_block) {
             Ok(()) => {