From 6d2cf9eebf4bddbf868aae7e80a2a0f3b22c4545 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Sun, 24 Apr 2016 11:36:20 +0100 Subject: [PATCH] v2v: target_bus_assignment: Various refactorings. No functional change. (cherry picked from commit c1adbe61dfd23ba28e286e0ecaf97bba6de9cdcd) --- v2v/target_bus_assignment.ml | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/v2v/target_bus_assignment.ml b/v2v/target_bus_assignment.ml index eb3ed58..0546004 100644 --- a/v2v/target_bus_assignment.ml +++ b/v2v/target_bus_assignment.ml @@ -34,13 +34,16 @@ let rec target_bus_assignment source targets guestcaps = (* Add the fixed disks (targets) to either the virtio-blk or IDE bus, * depending on whether the guest has virtio drivers or not. *) - iteri ( - fun i t -> - let t = BusSlotTarget t in + let () = + let bus = match guestcaps.gcaps_block_bus with - | Virtio_blk -> insert virtio_blk_bus i t - | IDE -> insert ide_bus i t - ) targets; + | Virtio_blk -> virtio_blk_bus + | IDE -> ide_bus in + iteri ( + fun i t -> + let t = BusSlotTarget t in + insert bus i t + ) targets in (* Now try to add the removable disks to the bus at the same slot * they originally occupied, but if the slot is occupied, emit a @@ -48,15 +51,16 @@ let rec target_bus_assignment source targets guestcaps = *) List.iter ( 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_slot with - | None -> ignore (insert_after bus 0 (BusSlotRemovable r)) + | None -> ignore (insert_after bus 0 t) | Some desired_slot_nr -> - if not (insert_after bus desired_slot_nr (BusSlotRemovable r)) then + if not (insert_after bus desired_slot_nr t) then warning (f_"removable %s device in slot %d clashes with another disk, so it has been moved to a higher numbered slot on the same bus. This may mean that this removable device has a different name inside the guest (for example a CD-ROM originally called /dev/hdc might move to /dev/hdd, or from D: to E: on a Windows guest).") (match r.s_removable_type with | CDROM -> s_"CD-ROM" @@ -77,16 +81,18 @@ and insert bus i slot = Array.blit oldbus 0 !bus 0 oldlen ); assert (!bus.(i) = BusSlotEmpty); - Array.set !bus i slot + !bus.(i) <- slot (* Insert a slot into the bus, but if the desired slot is not empty, then * increment the slot number until we find an empty one. Returns * true if we got the desired slot. *) and insert_after bus i slot = - let len = Array.length !bus in - if i >= len || Array.get !bus i = BusSlotEmpty then ( + if slot_is_empty bus i then ( insert bus i slot; true ) else ( ignore (insert_after bus (i+1) slot); false ) + +(* Return true if slot i is empty in the bus. *) +and slot_is_empty bus i = i >= Array.length !bus || !bus.(i) = BusSlotEmpty -- 1.8.3.1