MCPcopy Create free account
hub / github.com/cloud-hypervisor/cloud-hypervisor / aligned_pread

Function aligned_pread

block/src/qcow_common.rs:153–169  ·  view source on GitHub ↗

Read into `buf` via an aligned bounce buffer when O_DIRECT requires it.

(fd: RawFd, buf: &mut [u8], offset: u64, alignment: usize)

Source from the content-addressed store, hash-verified

151
152/// Read into `buf` via an aligned bounce buffer when O_DIRECT requires it.
153pub fn aligned_pread(fd: RawFd, buf: &mut [u8], offset: u64, alignment: usize) -> io::Result<()> {
154 if alignment == 0
155 || ((buf.as_ptr() as usize).is_multiple_of(alignment)
156 && buf.len().is_multiple_of(alignment)
157 && (offset as usize).is_multiple_of(alignment))
158 {
159 return pread_exact(fd, buf, offset);
160 }
161
162 let aligned_offset = offset & !(alignment as u64 - 1);
163 let head = (offset - aligned_offset) as usize;
164 let aligned_len = (head + buf.len()).next_multiple_of(alignment);
165 let mut bounce = AlignedBuf::new(aligned_len, alignment)?;
166 pread_exact(fd, bounce.as_mut_slice(aligned_len), aligned_offset)?;
167 buf.copy_from_slice(&bounce.as_slice(aligned_len)[head..head + buf.len()]);
168 Ok(())
169}
170
171/// Write `buf` via an aligned bounce buffer when O_DIRECT requires it.
172pub fn aligned_pwrite(fd: RawFd, buf: &[u8], offset: u64, alignment: usize) -> io::Result<()> {

Calls 5

pread_exactFunction · 0.85
newFunction · 0.85
as_mut_sliceMethod · 0.80
as_sliceMethod · 0.80
lenMethod · 0.45