[libvirt] [PATCH 1/3] qemu: Handle EEXIST gracefully in qemuDomainCreateDevice

Michal Privoznik mprivozn at redhat.com
Wed Jan 4 14:13:55 UTC 2017


https://bugzilla.redhat.com/show_bug.cgi?id=1406837

Imagine you have a domain configured in such way that you are
assigning two PCI devices that fall into the same IOMMU group.
With mount namespace enabled what happens is that for the first
PCI device corresponding /dev/vfio/X entry is created and when
the code tries to do the same for the second mknod() fails as
/dev/vfio/X already exists:

2016-12-21 14:40:45.648+0000: 24681: error :
qemuProcessReportLogError:1792 : internal error: Process exited
prior to exec: libvirt: QEMU Driver error : Failed to make device
/var/run/libvirt/qemu/windoze.dev//vfio/22: File exists

Worse, by default there are some devices that are created in the
namespace regardless of domain configuration (e.g. /dev/null,
/dev/urandom, etc.). If one of them is set as backend for some
guest device (e.g. rng, chardev, etc.) it's the same story as
described above.

Weirdly, in attach code this is already handled.

Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 src/qemu/qemu_domain.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 25cb4ad590..d05ebcb416 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -6957,10 +6957,12 @@ qemuDomainCreateDevice(const char *device,
     }
 
     if (mknod(devicePath, sb.st_mode, sb.st_rdev) < 0) {
-        virReportSystemError(errno,
-                             _("Failed to make device %s"),
-                             devicePath);
-        goto cleanup;
+        if (errno != EEXIST) {
+            virReportSystemError(errno,
+                                 _("Failed to make device %s"),
+                                 devicePath);
+            goto cleanup;
+        }
     }
 
     if (chown(devicePath, sb.st_uid, sb.st_gid) < 0) {
-- 
2.11.0




More information about the libvir-list mailing list