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