summary refs log tree commit diff
path: root/src
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
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')
-rw-r--r--src/linux.rs14
-rw-r--r--src/main.rs15
2 files changed, 11 insertions, 18 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))?;
diff --git a/src/main.rs b/src/main.rs
index 28bc09e..4dec03e 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -55,15 +55,9 @@ use vm_control::VmRequest;
 
 static SECCOMP_POLICY_DIR: &'static str = "/usr/share/policy/crosvm";
 
-enum DiskType {
-    FlatFile,
-    Qcow,
-}
-
 struct DiskOption {
     path: PathBuf,
     read_only: bool,
-    disk_type: DiskType,
 }
 
 /// Contains all the info needed to create the system's virtio devices.
@@ -233,11 +227,6 @@ fn set_argument(cfg: &mut Config, name: &str, value: Option<&str>) -> argument::
             cfg.virtio_dev_info.disks.push(DiskOption {
                 path: disk_path,
                 read_only: !name.starts_with("rw"),
-                disk_type: if name.ends_with("qcow") {
-                    DiskType::Qcow
-                } else {
-                    DiskType::FlatFile
-                },
             });
         }
         "host_ip" => {
@@ -448,9 +437,9 @@ fn run_vm(args: std::env::Args) -> std::result::Result<(), ()> {
                                 "PATH",
                                 "Path to a root disk image. Like `--disk` but adds appropriate kernel command line option."),
           Argument::short_value('d', "disk", "PATH", "Path to a disk image."),
-          Argument::value("qcow", "PATH", "Path to a qcow2 disk image."),
+          Argument::value("qcow", "PATH", "Path to a qcow2 disk image. (Deprecated; use --disk instead.)"),
           Argument::value("rwdisk", "PATH", "Path to a writable disk image."),
-          Argument::value("rwqcow", "PATH", "Path to a writable qcow2 disk image."),
+          Argument::value("rwqcow", "PATH", "Path to a writable qcow2 disk image. (Deprecated; use --rwdisk instead.)"),
           Argument::value("host_ip",
                           "IP",
                           "IP address to assign to host tap interface."),