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 structopt::StructOpt;
use time::Timespec; use time::Timespec;
use rcore_fs::{sfs, vfs}; use rcore_fs::{sfs, sefs, vfs};
const TTL: Timespec = Timespec { sec: 1, nsec: 0 }; // 1 second const TTL: Timespec = Timespec { sec: 1, nsec: 0 }; // 1 second
@ -227,10 +227,18 @@ struct Opt {
fn main() { fn main() {
env_logger::init().unwrap(); env_logger::init().unwrap();
let opt = Opt::from_args(); let opt = Opt::from_args();
let img = OpenOptions::new().read(true).write(true).open(&opt.image) // let img = OpenOptions::new().read(true).write(true).open(&opt.image)
.expect("failed to open image"); // .expect("failed to open image");
let sfs = sfs::SimpleFileSystem::open(Box::new(img)) let sfs = if opt.image.is_dir() {
.expect("failed to open sfs"); 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, &[]) fuse::mount(VfsWrapper::new(sfs), &opt.mount_point, &[])
.expect("failed to mount fs"); .expect("failed to mount fs");
} }

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

Loading…
Cancel
Save