Work on Inode Cache
This commit is contained in:
parent
665cdd8b37
commit
918f815a5b
|
@ -12,12 +12,13 @@ use std::{
|
||||||
use fuser::{FileAttr, FileType, Filesystem, FUSE_ROOT_ID};
|
use fuser::{FileAttr, FileType, Filesystem, FUSE_ROOT_ID};
|
||||||
use rustcryptfs_lib::GocryptFs;
|
use rustcryptfs_lib::GocryptFs;
|
||||||
|
|
||||||
use crate::error::Result;
|
use crate::{
|
||||||
|
error::Result,
|
||||||
|
inode_cache::{InodeCache, InodeCacheExt},
|
||||||
|
};
|
||||||
|
|
||||||
const BLOCK_SIZE: u64 = 4096;
|
const BLOCK_SIZE: u64 = 4096;
|
||||||
|
|
||||||
type InodeCache = BTreeMap<u64, PathBuf>;
|
|
||||||
|
|
||||||
pub struct EncryptedFs {
|
pub struct EncryptedFs {
|
||||||
fs: GocryptFs,
|
fs: GocryptFs,
|
||||||
inode_cache: InodeCache,
|
inode_cache: InodeCache,
|
||||||
|
@ -48,13 +49,6 @@ impl EncryptedFs {
|
||||||
fuser::mount2(self, mountpoint, &[]).unwrap();
|
fuser::mount2(self, mountpoint, &[]).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_path(&self, ino: u64) -> Option<PathBuf> {
|
|
||||||
// TODO CHECK PERM
|
|
||||||
|
|
||||||
// TODO AVOID CLONE
|
|
||||||
self.inode_cache.get(&ino).map(|p| p.clone())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_real_size(size: u64) -> u64 {
|
fn get_real_size(size: u64) -> u64 {
|
||||||
if size == 0 {
|
if size == 0 {
|
||||||
0
|
0
|
||||||
|
@ -86,6 +80,10 @@ impl EncryptedFs {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_path(&self, ino: u64) -> Option<&PathBuf> {
|
||||||
|
self.inode_cache.get_path(ino)
|
||||||
|
}
|
||||||
|
|
||||||
fn get_attr<P>(path: P, ino: u64) -> FileAttr
|
fn get_attr<P>(path: P, ino: u64) -> FileAttr
|
||||||
where
|
where
|
||||||
P: AsRef<Path>,
|
P: AsRef<Path>,
|
||||||
|
@ -120,27 +118,6 @@ impl EncryptedFs {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
trait InodeCacheExt {
|
|
||||||
fn get_or_insert_inode(&mut self, file_path: PathBuf) -> (u64, PathBuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
impl InodeCacheExt for InodeCache {
|
|
||||||
// TODO Try to avoid clone
|
|
||||||
fn get_or_insert_inode(&mut self, file_path: PathBuf) -> (u64, PathBuf) {
|
|
||||||
if let Some((ino, path)) = {
|
|
||||||
self.iter()
|
|
||||||
.find_map(|(i, p)| if p.eq(&file_path) { Some((i, p)) } else { None })
|
|
||||||
} {
|
|
||||||
(*ino, path.clone())
|
|
||||||
} else {
|
|
||||||
let ino = self.len() as u64 + 1;
|
|
||||||
self.insert(ino, file_path);
|
|
||||||
|
|
||||||
(ino, self.get(&ino).unwrap().clone())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Filesystem for EncryptedFs {
|
impl Filesystem for EncryptedFs {
|
||||||
fn access(&mut self, _req: &fuser::Request<'_>, ino: u64, mask: i32, reply: fuser::ReplyEmpty) {
|
fn access(&mut self, _req: &fuser::Request<'_>, ino: u64, mask: i32, reply: fuser::ReplyEmpty) {
|
||||||
if let Some(path) = self.get_path(ino) {
|
if let Some(path) = self.get_path(ino) {
|
||||||
|
@ -200,7 +177,7 @@ impl Filesystem for EncryptedFs {
|
||||||
offset: i64,
|
offset: i64,
|
||||||
mut reply: fuser::ReplyDirectory,
|
mut reply: fuser::ReplyDirectory,
|
||||||
) {
|
) {
|
||||||
if let Some(folder_path) = &self.get_path(ino) {
|
if let Some(folder_path) = &self.inode_cache.get_path(ino).cloned() {
|
||||||
let iv = std::fs::read(folder_path.join("gocryptfs.diriv")).unwrap();
|
let iv = std::fs::read(folder_path.join("gocryptfs.diriv")).unwrap();
|
||||||
|
|
||||||
let dir_decoder = self.fs.filename_decoder().get_decoder_for_dir(&iv);
|
let dir_decoder = self.fs.filename_decoder().get_decoder_for_dir(&iv);
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
use std::{collections::BTreeMap, path::PathBuf};
|
||||||
|
|
||||||
|
pub(crate) type InodeCache = BTreeMap<u64, PathBuf>;
|
||||||
|
|
||||||
|
pub(crate) trait InodeCacheExt {
|
||||||
|
fn get_or_insert_inode(&mut self, file_path: PathBuf) -> (u64, PathBuf);
|
||||||
|
|
||||||
|
fn get_path(&self, ino: u64) -> Option<&PathBuf>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl InodeCacheExt for InodeCache {
|
||||||
|
// TODO Try to avoid clone
|
||||||
|
fn get_or_insert_inode(&mut self, file_path: PathBuf) -> (u64, PathBuf) {
|
||||||
|
if let Some((ino, path)) =
|
||||||
|
self.iter()
|
||||||
|
.find_map(|(i, p)| if p.eq(&file_path) { Some((i, p)) } else { None })
|
||||||
|
{
|
||||||
|
(*ino, path.clone())
|
||||||
|
} else {
|
||||||
|
let ino = self.len() as u64 + 1;
|
||||||
|
self.insert(ino, file_path);
|
||||||
|
|
||||||
|
(ino, self.get(&ino).unwrap().clone())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_path(&self, ino: u64) -> Option<&PathBuf> {
|
||||||
|
// TODO CHECK PERM
|
||||||
|
self.get(&ino)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,6 @@
|
||||||
mod encrypted_filesystem;
|
mod encrypted_filesystem;
|
||||||
|
mod inode_cache;
|
||||||
|
|
||||||
pub mod error;
|
pub mod error;
|
||||||
|
|
||||||
pub use encrypted_filesystem::EncryptedFs;
|
pub use encrypted_filesystem::EncryptedFs;
|
Loading…
Reference in New Issue