The "s_disk_id" field is supposed to be unique across all fixed disks of the source domain.
With "-i vmx -it ssh" however, we restart assigning "s_disk_id" from zero near the end of the "find_hdds" function. The problem is that "find_hdds" is separately called from "find_scsi_disks", "find_nvme_disks", and "find_ide_disks". Thus, if we have at least two hard disks in the source on different controller types, we'll output two disks with a zero-value "s_disk_id". "input/input_vmx.ml" starts up nbdkit with "in%d" socket names that are based on list position, not "s_disk_id", so the nbdkit invocations are correct. However, in "convert/convert.ml", the "server" argument for "g#add_drive_opts" is based on "s_disk_id"; therefore, one of the disks will be multiply referenced, and the others will be ignored. Assign "s_disk_id" in "find_disks" [input/parse_domain_from_vmx.ml] once all the disks have been found and concatenated into the common list. Note that the global sorting order remains well-defined. Both before and after this patch, the sorting occurs *within* "find_hdds", but that's OK: the concatenation order between the type-specific disk-lists is well-defined (albeit arbitrary) in "find_disks". Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1883802 Signed-off-by: Laszlo Ersek <[email protected]> --- input/parse_domain_from_vmx.ml | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/input/parse_domain_from_vmx.ml b/input/parse_domain_from_vmx.ml index b812edeb81e2..5f5946f01a27 100644 --- a/input/parse_domain_from_vmx.ml +++ b/input/parse_domain_from_vmx.ml @@ -102,9 +102,12 @@ let remote_file_exists uri path = Sys.command cmd = 0 let rec find_disks vmx vmx_source = - find_scsi_disks vmx vmx_source - @ find_nvme_disks vmx vmx_source - @ find_ide_disks vmx vmx_source + (* Set the s_disk_id field to an incrementing number. *) + List.mapi + (fun i (source, filename) -> { source with s_disk_id = i }, filename) + (find_scsi_disks vmx vmx_source @ + find_nvme_disks vmx vmx_source @ + find_ide_disks vmx vmx_source) (* Find all SCSI hard disks. * @@ -209,12 +212,7 @@ and find_hdds vmx vmx_source * won't return them in any particular order. *) let hdds = List.sort compare hdds in - let hdds = List.map (fun (_, _, source, filename) -> source, filename) hdds in - - (* Set the s_disk_id field to an incrementing number. *) - let hdds = List.mapi (fun i (source, filename) -> - { source with s_disk_id = i }, filename) hdds in - hdds + List.map (fun (_, _, source, filename) -> source, filename) hdds (* Find all removable disks. * -- 2.19.1.3.g30247aa5d201 _______________________________________________ Libguestfs mailing list [email protected] https://listman.redhat.com/mailman/listinfo/libguestfs
