tried to implement file cluster extension (bug it's still bugged)

This commit is contained in:
Moritz Gmeiner 2025-08-03 01:32:48 +02:00
commit 9cb6ee6446
8 changed files with 253 additions and 77 deletions

View file

@ -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"

View file

@ -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

View file

@ -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);
};