tried to implement file cluster extension (bug it's still bugged)
This commit is contained in:
parent
343e8c6c77
commit
9cb6ee6446
8 changed files with 253 additions and 77 deletions
|
|
@ -6,12 +6,19 @@ edition = "2024"
|
|||
[dependencies]
|
||||
anyhow = "1.0.98"
|
||||
bitflags = "2.9.1"
|
||||
chrono = { version = "0.4.41", default-features = false, features = ["alloc", "clock", "std"] }
|
||||
chrono = { version = "0.4.41", default-features = false, features = [
|
||||
"alloc",
|
||||
"clock",
|
||||
"std",
|
||||
] }
|
||||
compact_string = "0.1.0"
|
||||
fat-bits = { version = "0.1.0", path = "../fat-bits" }
|
||||
fuser = "0.15.1"
|
||||
fxhash = "0.2.1"
|
||||
libc = "0.2.174"
|
||||
log = "0.4.27"
|
||||
rand = { version = "0.9.2", default-features = false, features = ["os_rng", "small_rng"] }
|
||||
rand = { version = "0.9.2", default-features = false, features = [
|
||||
"os_rng",
|
||||
"small_rng",
|
||||
] }
|
||||
thiserror = "2.0.12"
|
||||
|
|
|
|||
|
|
@ -117,11 +117,11 @@ impl Filesystem for FatFuse {
|
|||
let attr = inode.file_attr();
|
||||
let generation = inode.generation();
|
||||
|
||||
debug!("attr: {attr:?}");
|
||||
|
||||
reply.entry(&TTL, &attr, generation as u64);
|
||||
|
||||
inode.inc_ref_count();
|
||||
|
||||
// TODO: update access time
|
||||
}
|
||||
|
||||
fn forget(&mut self, _req: &fuser::Request<'_>, ino: u64, nlookup: u64) {
|
||||
|
|
@ -165,6 +165,14 @@ impl Filesystem for FatFuse {
|
|||
let attr = inode.file_attr();
|
||||
|
||||
inode.update_atime(SystemTime::now());
|
||||
if let Err(err) = inode.write_back(&self.fat_fs) {
|
||||
debug!("error while writing back inode: {err}");
|
||||
|
||||
reply.error(EIO);
|
||||
return;
|
||||
}
|
||||
|
||||
debug!("attr: {attr:?}");
|
||||
|
||||
reply.attr(&TTL, &attr);
|
||||
}
|
||||
|
|
@ -515,7 +523,7 @@ impl Filesystem for FatFuse {
|
|||
|
||||
let offset = offset as u64;
|
||||
|
||||
let Some(inode) = self.get_inode_by_fh(fh) else {
|
||||
let Some(inode) = self.get_inode_by_fh(fh).cloned() else {
|
||||
debug!("no inode associated with fh {fh} (given ino: {ino}");
|
||||
|
||||
reply.error(EBADF);
|
||||
|
|
@ -544,7 +552,7 @@ impl Filesystem for FatFuse {
|
|||
return;
|
||||
}
|
||||
|
||||
let mut writer = match inode.file_writer(&self.fat_fs) {
|
||||
let mut writer = match inode.file_writer(&mut self.fat_fs) {
|
||||
Ok(writer) => writer,
|
||||
Err(err) => {
|
||||
reply.error(err);
|
||||
|
|
@ -552,11 +560,6 @@ impl Filesystem for FatFuse {
|
|||
}
|
||||
};
|
||||
|
||||
// if writer.skip(offset) != offset {
|
||||
// // writer is at EOF, bail
|
||||
|
||||
// }
|
||||
|
||||
let cur_offset = writer.skip(offset);
|
||||
|
||||
// can't seek more than we requested
|
||||
|
|
|
|||
|
|
@ -320,7 +320,7 @@ impl Inode {
|
|||
Ok(fat_fs.file_reader(self.first_cluster()))
|
||||
}
|
||||
|
||||
pub fn file_writer<'a>(&'a self, fat_fs: &'a FatFs) -> Result<ClusterChainWriter<'a>, i32> {
|
||||
pub fn file_writer<'a>(&'a self, fat_fs: &'a mut FatFs) -> Result<ClusterChainWriter<'a>, i32> {
|
||||
if self.is_dir() {
|
||||
return Err(EISDIR);
|
||||
}
|
||||
|
|
@ -329,16 +329,30 @@ impl Inode {
|
|||
}
|
||||
|
||||
pub fn update_size(&mut self, new_size: u64) {
|
||||
debug!("updating size to {new_size}");
|
||||
|
||||
if new_size == self.size {
|
||||
return;
|
||||
}
|
||||
|
||||
self.size = new_size;
|
||||
self.dirty = true;
|
||||
}
|
||||
|
||||
pub fn update_atime(&mut self, atime: SystemTime) {
|
||||
if self.atime == atime {
|
||||
return;
|
||||
}
|
||||
|
||||
self.atime = atime;
|
||||
self.dirty = true;
|
||||
}
|
||||
|
||||
pub fn update_mtime(&mut self, mtime: SystemTime) {
|
||||
if self.mtime == mtime {
|
||||
return;
|
||||
}
|
||||
|
||||
self.mtime = mtime;
|
||||
self.dirty = true;
|
||||
}
|
||||
|
|
@ -348,6 +362,13 @@ impl Inode {
|
|||
return Ok(());
|
||||
}
|
||||
|
||||
if self.is_root() {
|
||||
// root dir has no attributes
|
||||
|
||||
self.dirty = false;
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let Some(parent_inode) = self.parent() else {
|
||||
anyhow::bail!("parent inode of {} does not exist", self.ino);
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue