Skip to content
Snippets Groups Projects
Commit d17b5508 authored by Jeremy Soller's avatar Jeremy Soller
Browse files

More efficient reads

parent cf728be7
No related branches found
No related tags found
No related merge requests found
use std::cmp::min;
use system::error::{Result, Error, EEXIST, EISDIR, ENOENT, ENOSPC, ENOTDIR, ENOTEMPTY};
use super::{Disk, ExNode, Extent, Header, Node};
......@@ -398,19 +400,51 @@ impl FileSystem {
let mut i = 0;
for extent in extents.iter() {
for (block, size) in extent.blocks() {
let mut block = extent.block;
let mut length = extent.length;
if byte_offset > 0 && length > 0 {
let mut sector = [0; 512];
try!(self.read_at(block, &mut sector));
if byte_offset < size && i < buf.len() {
for (s_b, mut b) in sector[byte_offset..size].iter().zip(buf[i..].iter_mut()) {
*b = *s_b;
i += 1;
}
let sector_size = min(sector.len() as u64, length) as usize;
for (s_b, mut b) in sector[byte_offset..sector_size].iter().zip(buf[i..].iter_mut()) {
*b = *s_b;
i += 1;
}
block += 1;
length -= sector_size as u64;
byte_offset = 0;
}
let length_aligned = ((min(length, (buf.len() - i) as u64)/512) * 512) as usize;
if length_aligned > 0 {
let extent_buf = &mut buf[i..i + length_aligned];
try!(self.read_at(block, extent_buf));
i += length_aligned;
block += (length_aligned as u64)/512;
length -= length_aligned as u64;
}
if length > 0 {
let mut sector = [0; 512];
try!(self.read_at(block, &mut sector));
let sector_size = min(sector.len() as u64, length) as usize;
for (s_b, mut b) in sector[..sector_size].iter().zip(buf[i..].iter_mut()) {
*b = *s_b;
i += 1;
}
block += 1;
length -= sector_size as u64;
}
assert_eq!(length, 0);
assert_eq!(block, extent.block + (extent.length + 511)/512);
}
Ok(i)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment