From fe6e3e8feff2fc5b9266c1cfb4e8ee18d30c14ec Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Thu, 12 Mar 2026 21:30:43 +0100 Subject: [PATCH] block: qcow_sync: impl AsyncDiskFile for QcowDiskSync Implement try_clone by sharing the metadata Arc and cloning the data file descriptor. The new_async_io method creates a QcowSync worker identical to the async_io::DiskFile version. Signed-off-by: Anatol Belski --- block/src/qcow_sync.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/block/src/qcow_sync.rs b/block/src/qcow_sync.rs index e9b64726e..e539754fc 100644 --- a/block/src/qcow_sync.rs +++ b/block/src/qcow_sync.rs @@ -328,6 +328,28 @@ impl disk_file::Resizable for QcowDiskSync { impl disk_file::DiskFile for QcowDiskSync {} +impl disk_file::AsyncDiskFile for QcowDiskSync { + fn try_clone(&self) -> BlockResult> { + Ok(Box::new(QcowDiskSync { + metadata: Arc::clone(&self.metadata), + backing_file: self.backing_file.as_ref().map(Arc::clone), + sparse: self.sparse, + data_raw_file: self.data_raw_file.clone(), + })) + } + + // ring_depth is unused - this sync backend performs blocking I/O + // instead of submitting to an async ring. + fn new_async_io(&self, _ring_depth: u32) -> BlockResult> { + Ok(Box::new(QcowSync::new( + Arc::clone(&self.metadata), + self.data_raw_file.clone(), + self.backing_file.as_ref().map(Arc::clone), + self.sparse, + ))) + } +} + pub struct QcowSync { metadata: Arc, data_file: QcowRawFile,