vmspawn: add extra drives *after* the primary drive, not before

Otherwise, if you mix --image= with --extra-drive= you end up with
/dev/sda pointing to the latter, nor the former. Which is really weird
of course...
This commit is contained in:
Lennart Poettering
2025-06-12 13:11:59 +02:00
committed by Daan De Meyer
parent 78f8d5ed71
commit 42514e5437

View File

@@ -1944,31 +1944,6 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) {
return log_oom();
}
unsigned i = 0;
STRV_FOREACH(drive, arg_extra_drives) {
_cleanup_free_ char *escaped_drive = NULL;
r = strv_extend(&cmdline, "-blockdev");
if (r < 0)
return log_oom();
escaped_drive = escape_qemu_value(*drive);
if (!escaped_drive)
return log_oom();
r = strv_extendf(&cmdline, "driver=raw,cache.direct=off,cache.no-flush=on,file.driver=file,file.filename=%s,node-name=vmspawn_extra_%u", escaped_drive, i);
if (r < 0)
return log_oom();
r = strv_extend(&cmdline, "-device");
if (r < 0)
return log_oom();
r = strv_extendf(&cmdline, "scsi-hd,drive=vmspawn_extra_%u", i++);
if (r < 0)
return log_oom();
}
if (kernel) {
r = strv_extend_many(&cmdline, "-kernel", kernel);
if (r < 0)
@@ -2035,6 +2010,31 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) {
return log_oom();
}
size_t i = 0;
STRV_FOREACH(drive, arg_extra_drives) {
_cleanup_free_ char *escaped_drive = NULL;
r = strv_extend(&cmdline, "-blockdev");
if (r < 0)
return log_oom();
escaped_drive = escape_qemu_value(*drive);
if (!escaped_drive)
return log_oom();
r = strv_extendf(&cmdline, "driver=raw,cache.direct=off,cache.no-flush=on,file.driver=file,file.filename=%s,node-name=vmspawn_extra_%zu", escaped_drive, i);
if (r < 0)
return log_oom();
r = strv_extend(&cmdline, "-device");
if (r < 0)
return log_oom();
r = strv_extendf(&cmdline, "scsi-hd,drive=vmspawn_extra_%zu", i++);
if (r < 0)
return log_oom();
}
r = strv_prepend(&arg_kernel_cmdline_extra, "console=hvc0");
if (r < 0)
return log_oom();