WIP: Add truncate
This commit is contained in:
+4
-2
@@ -83,11 +83,13 @@ impl Filesystem for RedoxFS {
|
||||
}
|
||||
|
||||
fn setattr(&mut self, _req: &Request, block: u64, _mode: Option<u32>,
|
||||
_uid: Option<u32>, _gid: Option<u32>, _size: Option<u64>,
|
||||
_uid: Option<u32>, _gid: Option<u32>, size: Option<u64>,
|
||||
_atime: Option<Timespec>, _mtime: Option<Timespec>, _fh: Option<u64>,
|
||||
_crtime: Option<Timespec>, _chgtime: Option<Timespec>, _bkuptime: Option<Timespec>,
|
||||
_flags: Option<u32>, reply: ReplyAttr) {
|
||||
//TODO: Implement truncate
|
||||
/*if let Some(truncate_size) = size {
|
||||
try!(self.fs.node_set_len(truncate_size));
|
||||
}*/
|
||||
match self.fs.node(block) {
|
||||
Ok(node) => {
|
||||
reply.attr(&TTL, &FileAttr {
|
||||
|
||||
+4
-4
@@ -18,7 +18,7 @@ pub trait Resource {
|
||||
|
||||
fn sync(&mut self) -> Result<usize>;
|
||||
|
||||
fn truncate(&mut self, len: usize) -> Result<usize>;
|
||||
fn truncate(&mut self, len: usize, fs: &mut FileSystem) -> Result<usize>;
|
||||
}
|
||||
|
||||
pub struct DirResource {
|
||||
@@ -82,7 +82,7 @@ impl Resource for DirResource {
|
||||
Err(Error::new(EINVAL))
|
||||
}
|
||||
|
||||
fn truncate(&mut self, _len: usize) -> Result<usize> {
|
||||
fn truncate(&mut self, _len: usize, _fs: &mut FileSystem) -> Result<usize> {
|
||||
Err(Error::new(EINVAL))
|
||||
}
|
||||
}
|
||||
@@ -152,7 +152,7 @@ impl Resource for FileResource {
|
||||
Ok(0)
|
||||
}
|
||||
|
||||
fn truncate(&mut self, len: usize) -> Result<usize> {
|
||||
Ok(0)
|
||||
fn truncate(&mut self, len: usize, fs: &mut FileSystem) -> Result<usize> {
|
||||
fs.node_set_len(self.block, len as u64).and(Ok(0))
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -230,7 +230,7 @@ impl Scheme for FileScheme {
|
||||
fn ftruncate(&mut self, id: usize, len: usize) -> Result<usize> {
|
||||
// println!("Ftruncate {}, {}", id, len);
|
||||
if let Some(mut file) = self.files.get_mut(&id) {
|
||||
file.truncate(len)
|
||||
file.truncate(len, &mut self.fs)
|
||||
} else {
|
||||
Err(Error::new(EBADF))
|
||||
}
|
||||
|
||||
@@ -323,6 +323,36 @@ impl FileSystem {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn node_set_len(&mut self, block: u64, mut length: u64) -> Result<()> {
|
||||
if block == 0 {
|
||||
return Err(Error::new(ENOENT));
|
||||
}
|
||||
|
||||
let mut changed = false;
|
||||
|
||||
let mut node = try!(self.node(block));
|
||||
for mut extent in node.1.extents.iter_mut() {
|
||||
if extent.length > length {
|
||||
//TODO: try!(self.deallocate(block, 512));
|
||||
extent.length = length;
|
||||
changed = true;
|
||||
length = 0;
|
||||
} else {
|
||||
length -= extent.length;
|
||||
}
|
||||
}
|
||||
|
||||
if changed {
|
||||
try!(self.write_at(node.0, &node.1));
|
||||
}
|
||||
|
||||
if node.1.next > 0 {
|
||||
self.node_set_len(node.1.next, length)
|
||||
} else {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
fn node_extents(&mut self, block: u64, mut offset: u64, mut len: usize, extents: &mut Vec<Extent>) -> Result<()> {
|
||||
if block == 0 {
|
||||
return Ok(());
|
||||
|
||||
Reference in New Issue
Block a user