| 86 | |
| 87 | impl disk_file::Resizable for RawDisk { |
| 88 | fn resize(&mut self, size: u64) -> BlockResult<()> { |
| 89 | let fd_metadata = self |
| 90 | .file |
| 91 | .metadata() |
| 92 | .map_err(|e| BlockError::new(BlockErrorKind::Io, DiskFileError::ResizeError(e)))?; |
| 93 | |
| 94 | if fd_metadata.file_type().is_block_device() { |
| 95 | // Block devices cannot be resized via ftruncate; they are resized |
| 96 | // externally (LVM, losetup, etc.). Verify the size matches. |
| 97 | let (actual_size, _) = query_device_size(&self.file) |
| 98 | .map_err(|e| BlockError::new(BlockErrorKind::Io, DiskFileError::ResizeError(e)))?; |
| 99 | if actual_size != size { |
| 100 | return Err(BlockError::new( |
| 101 | BlockErrorKind::Io, |
| 102 | DiskFileError::ResizeError(io::Error::other(format!( |
| 103 | "Block device size {actual_size} does not match requested size {size}" |
| 104 | ))), |
| 105 | )); |
| 106 | } |
| 107 | Ok(()) |
| 108 | } else { |
| 109 | self.file |
| 110 | .set_len(size) |
| 111 | .map_err(|e| BlockError::new(BlockErrorKind::Io, DiskFileError::ResizeError(e))) |
| 112 | } |
| 113 | } |
| 114 | } |
| 115 | |
| 116 | impl disk_file::DiskFile for RawDisk {} |