]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
vmspawn: add extra drives *after* the primary drive, not before
authorLennart Poettering <lennart@poettering.net>
Thu, 12 Jun 2025 11:11:59 +0000 (13:11 +0200)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Thu, 12 Jun 2025 14:32:50 +0000 (16:32 +0200)
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...

src/vmspawn/vmspawn.c

index 0def23f346b2e89aa4d9444213ad4a7923bb5fe1..add30e3cf2d39da2f74cba86a8ff5d96bcef8a2b 100644 (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();