use std::os::{fd::AsRawFd, unix::io::BorrowedFd};
nix::ioctl_read!(
blk_getsize64,
0x12,
114,
u64
);
nix::ioctl_write_ptr!(
blk_discard,
0x12,
119,
[u64; 2]
);
pub fn device_size(fd: BorrowedFd) -> nix::Result<u64> {
let mut size: u64 = 0;
unsafe { blk_getsize64(fd.as_raw_fd(), &raw mut size) }?;
Ok(size)
}
pub fn discard_range(
fd: BorrowedFd,
offset: u64,
length: u64,
) -> nix::Result<()> {
let range: [u64; 2] = [offset, length];
unsafe { blk_discard(fd.as_raw_fd(), &raw const range) }?;
Ok(())
}
pub fn discard_whole_device(fd: BorrowedFd) -> nix::Result<u64> {
let size = device_size(fd)?;
if size == 0 {
return Ok(0);
}
match discard_range(fd, 0, size) {
Ok(()) => Ok(size),
Err(nix::errno::Errno::EOPNOTSUPP) => Ok(0),
Err(e) => Err(e),
}
}