Add support to statfs on hostfs

This commit is contained in:
LI Qing 2023-03-01 11:27:39 +08:00 committed by volcano
parent 2093b360d5
commit 0ac398b635
3 changed files with 26 additions and 6 deletions

@ -5,7 +5,7 @@ pub use self::getcwd::do_getcwd;
pub use self::mount::{ pub use self::mount::{
do_mount, do_mount_rootfs, do_umount, MountFlags, MountOptions, UmountFlags, do_mount, do_mount_rootfs, do_umount, MountFlags, MountOptions, UmountFlags,
}; };
pub use self::statfs::{do_fstatfs, do_statfs, Statfs}; pub use self::statfs::{do_fstatfs, do_statfs, fetch_host_statfs, Statfs};
pub use self::sync::do_sync; pub use self::sync::do_sync;
mod chdir; mod chdir;

@ -82,7 +82,10 @@ impl TryFrom<FsInfo> for Statfs {
let statfs = if info.magic == rcore_fs_unionfs::UNIONFS_MAGIC let statfs = if info.magic == rcore_fs_unionfs::UNIONFS_MAGIC
|| info.magic == rcore_fs_sefs::SEFS_MAGIC as usize || info.magic == rcore_fs_sefs::SEFS_MAGIC as usize
{ {
let mut host_statfs = host_statfs()?; let mut host_statfs = {
let host_rootfs_dir = unsafe { format!("{}{}", INSTANCE_DIR, "/run/mount/__ROOT") };
fetch_host_statfs(&host_rootfs_dir)?
};
host_statfs.f_type = info.magic; host_statfs.f_type = info.magic;
host_statfs host_statfs
} else { } else {
@ -113,14 +116,30 @@ impl TryFrom<FsInfo> for Statfs {
} }
} }
fn host_statfs() -> Result<Statfs> { impl From<Statfs> for FsInfo {
fn from(statfs: Statfs) -> Self {
Self {
magic: statfs.f_type,
bsize: statfs.f_bsize,
frsize: statfs.f_frsize,
blocks: statfs.f_blocks,
bfree: statfs.f_bfree,
bavail: statfs.f_bavail,
files: statfs.f_files,
ffree: statfs.f_ffree,
namemax: statfs.f_namelen,
}
}
}
pub fn fetch_host_statfs(path: &str) -> Result<Statfs> {
extern "C" { extern "C" {
fn occlum_ocall_statfs(ret: *mut i32, path: *const i8, buf: *mut Statfs) -> sgx_status_t; fn occlum_ocall_statfs(ret: *mut i32, path: *const i8, buf: *mut Statfs) -> sgx_status_t;
} }
let mut ret: i32 = 0; let mut ret: i32 = 0;
let mut statfs: Statfs = Default::default(); let mut statfs: Statfs = Default::default();
let host_dir = unsafe { CString::new(INSTANCE_DIR.as_bytes()).unwrap() }; let host_dir = CString::new(path.as_bytes()).unwrap();
let sgx_status = unsafe { occlum_ocall_statfs(&mut ret, host_dir.as_ptr(), &mut statfs) }; let sgx_status = unsafe { occlum_ocall_statfs(&mut ret, host_dir.as_ptr(), &mut statfs) };
assert!(sgx_status == sgx_status_t::SGX_SUCCESS); assert!(sgx_status == sgx_status_t::SGX_SUCCESS);
assert!(ret == 0 || libc::errno() == Errno::EINTR as i32); assert!(ret == 0 || libc::errno() == Errno::EINTR as i32);

@ -1,3 +1,4 @@
use crate::fs::fs_ops::fetch_host_statfs;
use alloc::string::String; use alloc::string::String;
use alloc::sync::{Arc, Weak}; use alloc::sync::{Arc, Weak};
use core::any::Any; use core::any::Any;
@ -39,8 +40,8 @@ impl FileSystem for HostFS {
} }
fn info(&self) -> FsInfo { fn info(&self) -> FsInfo {
warn!("HostFS: FsInfo is unimplemented"); let statfs = fetch_host_statfs(&self.path.to_string_lossy()).unwrap();
Default::default() statfs.into()
} }
} }