From 8bd7c9c0d10699757e4edd6d3b5b9ae8667fb4a4 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Wed, 22 Jun 2016 15:04:26 +0100 Subject: [PATCH] v2v: Fix conversion of floppy removable devices (RHBZ#1309706). The previous code treated floppy disks and CD-ROMs as the same kind of thing, resulting in malformed libvirt XML. You would see the following error when importing a guest into libvirt: error: Failed to define domain from /tmp/v2vlibvirt063486.xml error: internal error: Invalid floppy device name: hdb because we incorrectly generated this bogus libvirt XML fragment: This commit models floppy devices as a distinct type, occupying their own bus ("/dev/fdX"). When writing to libvirt, we generate correct XML fragments, looking like this: Miscellaneous other changes were required in the code. There is also a regression test (see following commit). Note this ignores floppy disks in '-o qemu' mode. (cherry picked from commit b9613acb94e3328204d96efab0dfc8b8ed1d3368) --- v2v/input_libvirtxml.ml | 1 + v2v/output_libvirt.ml | 6 ++++-- v2v/output_qemu.ml | 4 ++++ v2v/target_bus_assignment.ml | 20 ++++++++++++-------- v2v/test-v2v-i-ova.xml | 2 +- v2v/types.ml | 1 + v2v/types.mli | 10 +++++++--- 7 files changed, 30 insertions(+), 14 deletions(-) diff --git a/v2v/input_libvirtxml.ml b/v2v/input_libvirtxml.ml index 1202302..a547edd 100644 --- a/v2v/input_libvirtxml.ml +++ b/v2v/input_libvirtxml.ml @@ -297,6 +297,7 @@ let parse_libvirt_xml ?conn xml = | Some s when String.is_prefix s "sd" -> get_drive_slot s 2 | Some s when String.is_prefix s "vd" -> get_drive_slot s 2 | Some s when String.is_prefix s "xvd" -> get_drive_slot s 3 + | Some s when String.is_prefix s "fd" -> get_drive_slot s 2 | Some s -> warning (f_" was ignored because the device name could not be recognized") s; None in diff --git a/v2v/output_libvirt.ml b/v2v/output_libvirt.ml index 05ad931..5a404ee 100644 --- a/v2v/output_libvirt.ml +++ b/v2v/output_libvirt.ml @@ -173,7 +173,6 @@ let create_libvirt_xml ?pool source target_buses guestcaps e "driver" [ "name", "qemu"; "type", "raw" ] []; e "target" [ "dev", drive_prefix ^ drive_name i; - "bus", bus_name ] [] ] in @@ -187,7 +186,10 @@ let create_libvirt_xml ?pool source target_buses guestcaps target_buses.target_ide_bus); Array.to_list (Array.mapi (make_disk "scsi" "sd") - target_buses.target_scsi_bus) + target_buses.target_scsi_bus); + Array.to_list + (Array.mapi (make_disk "floppy" "fd") + target_buses.target_floppy_bus) ] in append devices disks; diff --git a/v2v/output_qemu.ml b/v2v/output_qemu.ml index d079ccd..94f80c2 100644 --- a/v2v/output_qemu.ml +++ b/v2v/output_qemu.ml @@ -137,6 +137,10 @@ object in Array.iteri make_scsi target_buses.target_scsi_bus; + (* XXX Highly unlikely that anyone cares, but the current + * code ignores target_buses.target_floppy_bus. + *) + let net_bus = match guestcaps.gcaps_net_bus with | Virtio_net -> "virtio-net-pci" diff --git a/v2v/target_bus_assignment.ml b/v2v/target_bus_assignment.ml index 5ad8582..bce3a88 100644 --- a/v2v/target_bus_assignment.ml +++ b/v2v/target_bus_assignment.ml @@ -21,11 +21,11 @@ open Common_gettext.Gettext open Types -(* XXX This doesn't do the right thing for PC legacy floppy devices. *) let rec target_bus_assignment source targets guestcaps = let virtio_blk_bus = ref [| |] and ide_bus = ref [| |] - and scsi_bus = ref [| |] in + and scsi_bus = ref [| |] + and floppy_bus = ref [| |] in (* Add the fixed disks (targets) to either the virtio-blk or IDE bus, * depending on whether the guest has virtio drivers or not. @@ -65,11 +65,14 @@ let rec target_bus_assignment source targets guestcaps = fun r -> let t = BusSlotRemovable r in let bus = - match r.s_removable_controller with - | None -> ide_bus (* Wild guess, but should be safe. *) - | Some Source_virtio_blk -> virtio_blk_bus - | Some Source_IDE -> ide_bus - | Some Source_SCSI -> scsi_bus in + match r.s_removable_type with + | Floppy -> floppy_bus + | CDROM -> + match r.s_removable_controller with + | None -> ide_bus (* Wild guess, but should be safe. *) + | Some Source_virtio_blk -> virtio_blk_bus + | Some Source_IDE -> ide_bus + | Some Source_SCSI -> scsi_bus in match r.s_removable_slot with | None -> @@ -88,7 +91,8 @@ let rec target_bus_assignment source targets guestcaps = { target_virtio_blk_bus = !virtio_blk_bus; target_ide_bus = !ide_bus; - target_scsi_bus = !scsi_bus } + target_scsi_bus = !scsi_bus; + target_floppy_bus = !floppy_bus } (* Insert a slot into the bus array, making the array bigger if necessary. *) and insert bus i slot = diff --git a/v2v/test-v2v-i-ova.xml b/v2v/test-v2v-i-ova.xml index bb765e3..6dcfc31 100644 --- a/v2v/test-v2v-i-ova.xml +++ b/v2v/test-v2v-i-ova.xml @@ -27,7 +27,7 @@ - + diff --git a/v2v/types.ml b/v2v/types.ml index d082594..7491be4 100644 --- a/v2v/types.ml +++ b/v2v/types.ml @@ -363,6 +363,7 @@ type target_buses = { target_virtio_blk_bus : target_bus_slot array; target_ide_bus : target_bus_slot array; target_scsi_bus : target_bus_slot array; + target_floppy_bus : target_bus_slot array; } and target_bus_slot = diff --git a/v2v/types.mli b/v2v/types.mli index 18ac138..c1cb245 100644 --- a/v2v/types.mli +++ b/v2v/types.mli @@ -254,10 +254,11 @@ type target_buses = { target_virtio_blk_bus : target_bus_slot array; target_ide_bus : target_bus_slot array; target_scsi_bus : target_bus_slot array; + target_floppy_bus : target_bus_slot array; } (** Mapping of fixed and removable disks to buses. - As shown in the diagram below, there are (currently) three buses + As shown in the diagram below, there are (currently) four buses attached to the target VM. Each contains a chain of fixed or removable disks. Slots can also be empty. @@ -276,8 +277,11 @@ type target_buses = { ├────┤ hda ├───┤ hdb ├───┤ hdc ├───┤ hdd │ IDE bus │ └─────┘ └─────┘ └─────┘ └─────┘ │ ┌─────┐ ┌─────┐ - └────┤ - ├───┤ vdb │ Virtio-blk bus - └─────┘ └─────┘ + ├────┤ - ├───┤ vdb │ Virtio-blk bus + │ └─────┘ └─────┘ + │ ┌─────┐ + └────┤ fda │ Floppy disks + └─────┘ v} *) -- 1.8.3.1