diff --git a/block/src/error.rs b/block/src/error.rs index 4b89bbb21..ebaa33ec5 100644 --- a/block/src/error.rs +++ b/block/src/error.rs @@ -68,6 +68,8 @@ pub enum ErrorOp { DetectImageType, /// Duplicating a backing-file descriptor. DupBackingFd, + /// Resizing a disk image. + Resize, } impl Display for ErrorOp { @@ -76,6 +78,7 @@ impl Display for ErrorOp { Self::Open => write!(f, "open"), Self::DetectImageType => write!(f, "detect_image_type"), Self::DupBackingFd => write!(f, "dup_backing_fd"), + Self::Resize => write!(f, "resize"), } } } diff --git a/block/src/qcow_sync.rs b/block/src/qcow_sync.rs index c75e895e8..4c2611a5a 100644 --- a/block/src/qcow_sync.rs +++ b/block/src/qcow_sync.rs @@ -308,6 +308,24 @@ impl disk_file::SparseCapable for QcowDiskSync { } } +impl disk_file::Resizable for QcowDiskSync { + fn resize(&mut self, size: u64) -> BlockResult<()> { + if self.backing_file.is_some() { + return Err(BlockError::new( + BlockErrorKind::UnsupportedFeature, + DiskFileError::ResizeError(io::Error::other( + "resize not supported with backing file", + )), + ) + .with_op(ErrorOp::Resize)); + } + self.metadata.resize(size).map_err(|e| { + BlockError::new(BlockErrorKind::Io, DiskFileError::ResizeError(e)) + .with_op(ErrorOp::Resize) + }) + } +} + pub struct QcowSync { metadata: Arc, data_file: QcowRawFile,