diff --git a/src/filesystem.rs b/src/filesystem.rs index 020b46d81a5b802c04331d7851ce986c89aaa324..dc9ae7e6d940f61b2e3813bb69d6ce04a731e01d 100644 --- a/src/filesystem.rs +++ b/src/filesystem.rs @@ -296,16 +296,31 @@ impl FileSystem { return Err(Error::new(ENOENT)); } - let node = try!(self.node(block)); - for extent in node.1.extents.iter() { + let mut changed = false; + + let mut node = try!(self.node(block)); + for mut extent in node.1.extents.iter_mut() { if extent.length >= length { length = 0; break; } else { - length -= extent.length; + changed = true; + let allocated = ((extent.length + 511)/512) * 512; + if allocated >= length { + extent.length = length; + length = 0; + break; + } else { + extent.length = allocated; + length -= allocated; + } } } + if changed { + try!(self.write_at(node.0, &node.1)); + } + if length > 0 { if node.1.next > 0 { self.node_ensure_len(node.1.next, length) @@ -459,6 +474,8 @@ impl FileSystem { let mut extents = Vec::new(); try!(self.node_extents(block, block_offset, byte_offset + buf.len(), &mut extents)); + println!("{:?}", extents); + let mut i = 0; for extent in extents.iter() { let mut block = extent.block;