Read into `buf` via an aligned bounce buffer when O_DIRECT requires it.
(fd: RawFd, buf: &mut [u8], offset: u64, alignment: usize)
| 151 | |
| 152 | /// Read into `buf` via an aligned bounce buffer when O_DIRECT requires it. |
| 153 | pub 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. |
| 172 | pub fn aligned_pwrite(fd: RawFd, buf: &[u8], offset: u64, alignment: usize) -> io::Result<()> { |