diff --git a/scheme/scheme.rs b/scheme/scheme.rs
index c6ff37b140821cd8aa57f5d5ff09f84cf68d54ba..3774a65cedc874cc5b3c5555267255dc660b4b92 100644
--- a/scheme/scheme.rs
+++ b/scheme/scheme.rs
@@ -7,7 +7,7 @@ use std::collections::BTreeMap;
 use std::str;
 use std::sync::atomic::{AtomicUsize, Ordering};
 
-use syscall::data::Stat;
+use syscall::data::{Stat, StatVfs};
 use syscall::error::{Error, Result, EACCES, EEXIST, EISDIR, ENOTDIR, EPERM, ENOENT, EBADF};
 use syscall::flag::{O_CREAT, O_TRUNC, O_ACCMODE, O_RDONLY, O_WRONLY, O_RDWR, MODE_PERM};
 use syscall::scheme::Scheme;
@@ -403,6 +403,25 @@ impl Scheme for FileScheme {
         }
     }
 
+    fn fstatvfs(&self, id: usize, stat: &mut StatVfs) -> Result<usize> {
+        let files = self.files.lock();
+        if let Some(_file) = files.get(&id) {
+            let mut fs = self.fs.borrow_mut();
+
+            let free = fs.header.1.free;
+            let free_size = fs.node_len(free)?;
+
+            stat.f_bsize = 512;
+            stat.f_blocks = fs.header.1.size/(stat.f_bsize as u64);
+            stat.f_bfree = free_size/(stat.f_bsize as u64);
+            stat.f_bavail = stat.f_bfree;
+
+            Ok(0)
+        } else {
+            Err(Error::new(EBADF))
+        }
+    }
+
     fn fsync(&self, id: usize) -> Result<usize> {
         // println!("Fsync {}", id);
         let mut files = self.files.lock();