FUSE works for SEFS!

master
WangRunji 7 years ago
parent 15632fd69b
commit 32a3a8c8b1

@ -9,7 +9,7 @@ use fuse::{FileAttr, Filesystem, FileType, ReplyAttr, ReplyData, ReplyDirectory,
use structopt::StructOpt;
use time::Timespec;
use rcore_fs::{sfs, vfs};
use rcore_fs::{sfs, sefs, vfs};
const TTL: Timespec = Timespec { sec: 1, nsec: 0 }; // 1 second
@ -227,10 +227,18 @@ struct Opt {
fn main() {
env_logger::init().unwrap();
let opt = Opt::from_args();
let img = OpenOptions::new().read(true).write(true).open(&opt.image)
.expect("failed to open image");
let sfs = sfs::SimpleFileSystem::open(Box::new(img))
.expect("failed to open sfs");
// let img = OpenOptions::new().read(true).write(true).open(&opt.image)
// .expect("failed to open image");
let sfs = if opt.image.is_dir() {
let img = sefs::std_impl::StdStorage::new(&opt.image);
sefs::SEFS::open(Box::new(img))
.expect("failed to open sefs")
} else {
std::fs::create_dir_all(&opt.image).unwrap();
let img = sefs::std_impl::StdStorage::new(&opt.image);
sefs::SEFS::create(Box::new(img))
.expect("failed to create sefs")
};
fuse::mount(VfsWrapper::new(sfs), &opt.mount_point, &[])
.expect("failed to mount fs");
}

@ -13,7 +13,7 @@ use crate::vfs::{self, FileSystem, FsError, INode, Timespec};
use self::structs::*;
mod structs;
mod std_impl;
pub mod std_impl;
/// A file stores a normal file or directory.
///
@ -174,21 +174,21 @@ impl vfs::INode for INodeImpl {
fn info(&self) -> vfs::Result<vfs::FileInfo> {
let disk_inode = self.disk_inode.read();
Ok(vfs::FileInfo {
inode: 0,
inode: self.id,
size: match disk_inode.type_ {
FileType::File => disk_inode.size as usize,
FileType::Dir => disk_inode.blocks as usize,
_ => panic!("Unknown file type"),
},
mode: 0,
mode: 0o777,
type_: vfs::FileType::from(disk_inode.type_.clone()),
blocks: disk_inode.blocks as usize,
atime: Timespec { sec: 0, nsec: 0 },
mtime: Timespec { sec: 0, nsec: 0 },
ctime: Timespec { sec: 0, nsec: 0 },
atime: Timespec { sec: disk_inode.atime as i64, nsec: 0 },
mtime: Timespec { sec: disk_inode.mtime as i64, nsec: 0 },
ctime: Timespec { sec: disk_inode.ctime as i64, nsec: 0 },
nlinks: disk_inode.nlinks as usize,
uid: 0,
gid: 0
uid: disk_inode.uid as usize,
gid: disk_inode.gid as usize,
})
}
fn sync(&self) -> vfs::Result<()> {

Loading…
Cancel
Save