| 2028 | |
| 2029 | impl Read for QcowFile { |
| 2030 | fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> { |
| 2031 | let address: u64 = self.current_offset; |
| 2032 | let read_count: usize = self.limit_range_file(address, buf.len()); |
| 2033 | |
| 2034 | let mut nread: usize = 0; |
| 2035 | while nread < read_count { |
| 2036 | let curr_addr = address + nread as u64; |
| 2037 | let count = self.limit_range_cluster(curr_addr, read_count - nread); |
| 2038 | |
| 2039 | if (self.file_read(curr_addr, count, &mut buf[nread..(nread + count)])?).is_some() { |
| 2040 | // Data is successfully read from the cluster |
| 2041 | } else if let Some(backing) = self.backing_file.as_mut() { |
| 2042 | backing.read_at(curr_addr, &mut buf[nread..(nread + count)])?; |
| 2043 | } else { |
| 2044 | // Previously unwritten region, return zeros |
| 2045 | buf[nread..(nread + count)].fill(0); |
| 2046 | } |
| 2047 | |
| 2048 | nread += count; |
| 2049 | } |
| 2050 | self.current_offset += read_count as u64; |
| 2051 | Ok(read_count) |
| 2052 | } |
| 2053 | } |
| 2054 | |
| 2055 | impl Seek for QcowFile { |