block: qcow: Add open_disk_image helper with path context

Add a small helper in the block crate that opens a disk image
file and wraps any failure in a BlockError carrying the file
path and operation context. Use it from the vmm device manager
so that a failed open now reports which path couldn't be opened.

Signed-off-by: Anatol Belski <anbelski@linux.microsoft.com>
This commit is contained in:
Anatol Belski
2026-03-05 18:26:54 +01:00
committed by Rob Bradford
parent 2bcbe25539
commit 4fea912d18
2 changed files with 19 additions and 12 deletions

View File

@@ -32,7 +32,7 @@ pub mod vhdx_sync;
use std::alloc::{Layout, alloc_zeroed, dealloc};
use std::collections::VecDeque;
use std::fmt::{self, Debug};
use std::fs::File;
use std::fs::{File, OpenOptions};
use std::io::{self, IoSlice, IoSliceMut, Read, Seek, SeekFrom, Write};
use std::os::linux::fs::MetadataExt;
use std::os::unix::io::AsRawFd;
@@ -1065,6 +1065,16 @@ pub fn read_aligned_block_size(f: &mut File) -> std::io::Result<Vec<u8>> {
Ok(data)
}
/// Open a disk image file, returning a [`BlockError`] with path context
/// on failure.
pub fn open_disk_image(path: &Path, options: &OpenOptions) -> BlockResult<File> {
options.open(path).map_err(|e| {
BlockError::new(BlockErrorKind::Io, e)
.with_op(ErrorOp::Open)
.with_path(path)
})
}
/// Determine image type through file parsing.
pub fn detect_image_type(f: &mut File) -> BlockResult<ImageType> {
let block = read_aligned_block_size(f)

View File

@@ -41,7 +41,7 @@ use block::raw_sync::RawFileDiskSync;
use block::vhdx_sync::VhdxDiskSync;
use block::{
ImageType, block_aio_is_supported, block_io_uring_is_supported, detect_image_type,
preallocate_disk, vhdx,
open_disk_image, preallocate_disk, vhdx,
};
#[cfg(feature = "io_uring")]
use block::{fixed_vhd_async::FixedVhdDiskAsync, raw_async::RawFileDisk};
@@ -177,7 +177,7 @@ pub enum DeviceManagerError {
/// Cannot open disk path
#[error("Cannot open disk path")]
Disk(#[source] io::Error),
Disk(#[source] BlockError),
/// Cannot create vhost-user-net device
#[error("Cannot create vhost-user-net device")]
@@ -2663,15 +2663,12 @@ impl DeviceManager {
options.custom_flags(libc::O_DIRECT);
}
// Open block device path
let mut file: File = options
.open(
disk_cfg
.path
.as_ref()
.ok_or(DeviceManagerError::NoDiskPath)?
.clone(),
)
.map_err(DeviceManagerError::Disk)?;
let disk_path = disk_cfg
.path
.as_ref()
.ok_or(DeviceManagerError::NoDiskPath)?;
let mut file: File =
open_disk_image(disk_path, &options).map_err(DeviceManagerError::Disk)?;
let detected_image_type =
detect_image_type(&mut file).map_err(DeviceManagerError::DetectImageType)?;