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();