From: Nick Labich Date: Fri, 27 Jun 2025 15:52:09 +0000 (-0400) Subject: vmspawn: Use host_device driver for --extra-drive block devices X-Git-Tag: v258-rc1~220 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=878c2b28df5e3d26767193e77b806f6c2717de17;p=thirdparty%2Fsystemd.git vmspawn: Use host_device driver for --extra-drive block devices Extra drives attached to VMs use the file driver for regular files and the host_device driver for block devices. Fixes https://github.com/systemd/systemd/issues/37986 --- diff --git a/src/vmspawn/vmspawn.c b/src/vmspawn/vmspawn.c index a717f3b0bd6..49833ec49fc 100644 --- a/src/vmspawn/vmspawn.c +++ b/src/vmspawn/vmspawn.c @@ -2013,6 +2013,8 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) { size_t i = 0; STRV_FOREACH(drive, arg_extra_drives) { _cleanup_free_ char *escaped_drive = NULL; + const char *driver = NULL; + struct stat st; r = strv_extend(&cmdline, "-blockdev"); if (r < 0) @@ -2022,7 +2024,17 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) { 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 (stat(*drive, &st) < 0) + return log_error_errno(errno, "Failed to stat '%s': %m", *drive); + + if (S_ISREG(st.st_mode)) + driver = "file"; + else if (S_ISBLK(st.st_mode)) + driver = "host_device"; + else + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Expected regular file or block device, not '%s': %m", *drive); + + r = strv_extendf(&cmdline, "driver=raw,cache.direct=off,cache.no-flush=on,file.driver=%s,file.filename=%s,node-name=vmspawn_extra_%zu", driver, escaped_drive, i); if (r < 0) return log_oom();