summary refs log tree commit diff
path: root/src/linux.rs
diff options
context:
space:
mode:
authorDaniel Verkamp <dverkamp@chromium.org>2018-10-10 17:25:14 -0700
committerchrome-bot <chrome-bot@chromium.org>2018-10-19 12:19:52 -0700
commitf02fdd1f663760fc884073ea74fffb39a3f4ea4c (patch)
tree5cc148458abb1d8e7be7f99f227d2b4028f3f142 /src/linux.rs
parentde198cc9be3f3741a4c9cc6f97275cc4ec7f7505 (diff)
downloadcrosvm-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.rs14
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))?;