diff options
author | Daniel Verkamp <dverkamp@chromium.org> | 2018-10-10 17:25:14 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-10-19 12:19:52 -0700 |
commit | f02fdd1f663760fc884073ea74fffb39a3f4ea4c (patch) | |
tree | 5cc148458abb1d8e7be7f99f227d2b4028f3f142 /src/linux.rs | |
parent | de198cc9be3f3741a4c9cc6f97275cc4ec7f7505 (diff) | |
download | crosvm-f02fdd1f663760fc884073ea74fffb39a3f4ea4c.tar crosvm-f02fdd1f663760fc884073ea74fffb39a3f4ea4c.tar.gz crosvm-f02fdd1f663760fc884073ea74fffb39a3f4ea4c.tar.bz2 crosvm-f02fdd1f663760fc884073ea74fffb39a3f4ea4c.tar.lz crosvm-f02fdd1f663760fc884073ea74fffb39a3f4ea4c.tar.xz crosvm-f02fdd1f663760fc884073ea74fffb39a3f4ea4c.tar.zst crosvm-f02fdd1f663760fc884073ea74fffb39a3f4ea4c.zip |
main: autodetect disk image type
Make --disk and --rwdisk automatically distinguish between qcow2 and raw disk images. --qcow and --rwqcow are kept as aliases for compatibility. BUG=chromium:893380 TEST=Boot crosvm with both raw and qcow2 disk images. Change-Id: I5b572626ca5ab894c78454f59355f27d552cbf7d Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1275185 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Reviewed-by: Stephen Barber <smbarber@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org>
Diffstat (limited to 'src/linux.rs')
-rw-r--r-- | src/linux.rs | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/linux.rs b/src/linux.rs index 4975ab9..903b6b1 100644 --- a/src/linux.rs +++ b/src/linux.rs @@ -29,14 +29,13 @@ use devices::{self, PciDevice, VirtioPciDevice}; use io_jail::{self, Minijail}; use kvm::*; use net_util::Tap; -use qcow::{self, QcowFile}; +use qcow::{self, ImageType, QcowFile}; use sys_util; use sys_util::*; use vhost; use vm_control::VmRequest; use Config; -use DiskType; use VirtIoDeviceInfo; use arch::{self, LinuxArch, RunnableLinuxVm, VirtioDeviceStub, VmComponents}; @@ -58,6 +57,7 @@ pub enum Error { CreateSignalFd(sys_util::SignalFdError), CreateSocket(io::Error), CreateTimerFd(sys_util::Error), + DetectImageType(qcow::Error), DeviceJail(io_jail::Error), DevicePivotRoot(io_jail::Error), Disk(io::Error), @@ -112,6 +112,9 @@ impl fmt::Display for Error { &Error::CreateSignalFd(ref e) => write!(f, "failed to create signalfd: {:?}", e), &Error::CreateSocket(ref e) => write!(f, "failed to create socket: {}", e), &Error::CreateTimerFd(ref e) => write!(f, "failed to create timerfd: {}", e), + &Error::DetectImageType(ref e) => { + write!(f, "failed to detect disk image type: {:?}", e) + } &Error::DeviceJail(ref e) => write!(f, "failed to jail device: {}", e), &Error::DevicePivotRoot(ref e) => write!(f, "failed to pivot root device: {}", e), &Error::Disk(ref e) => write!(f, "failed to load disk image: {}", e), @@ -286,15 +289,16 @@ fn create_virtio_devs( }; flock(&raw_image, lock_op, true).map_err(Error::DiskImageLock)?; - let block_box: Box<devices::virtio::VirtioDevice> = match disk.disk_type { - DiskType::FlatFile => { + let image_type = qcow::detect_image_type(&raw_image).map_err(Error::DetectImageType)?; + let block_box: Box<devices::virtio::VirtioDevice> = match image_type { + ImageType::Raw => { // Access as a raw block device. Box::new( devices::virtio::Block::new(raw_image, disk.read_only) .map_err(|e| Error::BlockDeviceNew(e))?, ) } - DiskType::Qcow => { + ImageType::Qcow2 => { // Valid qcow header present let qcow_image = QcowFile::from(raw_image).map_err(|e| Error::QcowDeviceCreate(e))?; |