From abca6f3ce994daac7abfba93b11f221804df6972 Mon Sep 17 00:00:00 2001 From: Julio Montes Date: Wed, 22 Jul 2020 11:36:14 -0500 Subject: [PATCH] Add multidevs option to fsdev multidevs specifies how to deal with multiple devices being shared with a 9p export. `multidevs=remap` fixes the following warning: ``` 9p: Multiple devices detected in same VirtFS export, which might lead to file ID collisions and severe misbehaviours on guest! You should either use a separate export for each device shared from host or use virtfs option 'multidevs=remap'! ``` Signed-off-by: Julio Montes --- qemu/qemu.go | 25 +++++++++++++++++++++++++ qemu/qemu_arch_base_test.go | 2 +- qemu/qemu_s390x_test.go | 2 +- qemu/qemu_test.go | 1 + 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/qemu/qemu.go b/qemu/qemu.go index a149dad8b..4716595cd 100644 --- a/qemu/qemu.go +++ b/qemu/qemu.go @@ -288,6 +288,23 @@ func (object Object) QemuParams(config *Config) []string { return qemuParams } +// Virtio9PMultidev filesystem behaviour to deal +// with multiple devices being shared with a 9p export. +type Virtio9PMultidev string + +const ( + // Remap shares multiple devices with only one export. + Remap Virtio9PMultidev = "remap" + + // Warn assumes that only one device is shared by the same export. + // Only a warning message is logged (once) by qemu on host side. + // This is the default behaviour. + Warn Virtio9PMultidev = "warn" + + // Forbid like "warn" but also deny access to additional devices on guest. + Forbid Virtio9PMultidev = "forbid" +) + // FSDriver represents a qemu filesystem driver. type FSDriver string @@ -350,6 +367,10 @@ type FSDevice struct { // Transport is the virtio transport for this device. Transport VirtioTransport + + // Multidev is the filesystem behaviour to deal + // with multiple devices being shared with a 9p export + Multidev Virtio9PMultidev } // Virtio9PTransport is a map of the virtio-9p device name that corresponds @@ -393,6 +414,10 @@ func (fsdev FSDevice) QemuParams(config *Config) []string { fsParams = append(fsParams, fmt.Sprintf(",path=%s", fsdev.Path)) fsParams = append(fsParams, fmt.Sprintf(",security_model=%s", fsdev.SecurityModel)) + if fsdev.Multidev != "" { + fsParams = append(fsParams, fmt.Sprintf(",multidevs=%s", fsdev.Multidev)) + } + qemuParams = append(qemuParams, "-device") qemuParams = append(qemuParams, strings.Join(deviceParams, "")) diff --git a/qemu/qemu_arch_base_test.go b/qemu/qemu_arch_base_test.go index 3e22ceeb0..58de5d1ea 100644 --- a/qemu/qemu_arch_base_test.go +++ b/qemu/qemu_arch_base_test.go @@ -21,7 +21,7 @@ package qemu import "testing" var ( - deviceFSString = "-device virtio-9p-pci,disable-modern=true,fsdev=workload9p,mount_tag=rootfs,romfile=efi-virtio.rom -fsdev local,id=workload9p,path=/var/lib/docker/devicemapper/mnt/e31ebda2,security_model=none" + deviceFSString = "-device virtio-9p-pci,disable-modern=true,fsdev=workload9p,mount_tag=rootfs,romfile=efi-virtio.rom -fsdev local,id=workload9p,path=/var/lib/docker/devicemapper/mnt/e31ebda2,security_model=none,multidevs=remap" deviceNetworkString = "-netdev tap,id=tap0,vhost=on,ifname=ceth0,downscript=no,script=no -device driver=virtio-net-pci,netdev=tap0,mac=01:02:de:ad:be:ef,disable-modern=true,romfile=efi-virtio.rom" deviceNetworkStringMq = "-netdev tap,id=tap0,vhost=on,fds=3:4 -device driver=virtio-net-pci,netdev=tap0,mac=01:02:de:ad:be:ef,disable-modern=true,mq=on,vectors=6,romfile=efi-virtio.rom" deviceSerialString = "-device virtio-serial-pci,disable-modern=true,id=serial0,romfile=efi-virtio.rom,max_ports=2" diff --git a/qemu/qemu_s390x_test.go b/qemu/qemu_s390x_test.go index 9e9cb4024..459bb641d 100644 --- a/qemu/qemu_s390x_test.go +++ b/qemu/qemu_s390x_test.go @@ -23,7 +23,7 @@ import "testing" // -pci devices don't play well with Z hence replace them with corresponding -ccw devices // See https://wiki.qemu.org/Documentation/Platforms/S390X var ( - deviceFSString = "-device virtio-9p-ccw,fsdev=workload9p,mount_tag=rootfs,devno=" + DevNo + " -fsdev local,id=workload9p,path=/var/lib/docker/devicemapper/mnt/e31ebda2,security_model=none" + deviceFSString = "-device virtio-9p-ccw,fsdev=workload9p,mount_tag=rootfs,devno=" + DevNo + " -fsdev local,id=workload9p,path=/var/lib/docker/devicemapper/mnt/e31ebda2,security_model=none,multidevs=remap" deviceNetworkString = "-netdev tap,id=tap0,vhost=on,ifname=ceth0,downscript=no,script=no -device driver=virtio-net-ccw,netdev=tap0,mac=01:02:de:ad:be:ef,devno=" + DevNo deviceNetworkStringMq = "-netdev tap,id=tap0,vhost=on,fds=3:4 -device driver=virtio-net-ccw,netdev=tap0,mac=01:02:de:ad:be:ef,mq=on,devno=" + DevNo deviceSerialString = "-device virtio-serial-ccw,id=serial0,devno=" + DevNo diff --git a/qemu/qemu_test.go b/qemu/qemu_test.go index fe02bbdb4..2e7669a15 100644 --- a/qemu/qemu_test.go +++ b/qemu/qemu_test.go @@ -149,6 +149,7 @@ func TestAppendDeviceFS(t *testing.T) { SecurityModel: None, DisableModern: true, ROMFile: "efi-virtio.rom", + Multidev: Remap, } if fsdev.Transport.isVirtioCCW(nil) {