]> xenbits.xensource.com Git - libvirt.git/commitdiff
udev: fix regression with qemu:///session
authorEric Blake <eblake@redhat.com>
Wed, 16 Mar 2011 21:47:32 +0000 (15:47 -0600)
committerEric Blake <eblake@redhat.com>
Mon, 21 Mar 2011 16:47:48 +0000 (10:47 -0600)
https://bugzilla.redhat.com/show_bug.cgi?id=684655 points out
a regression introduced in commit 2215050edd - non-root users
can't connect to qemu:///session because libvirtd dies when
it can't use pciaccess initialization.

* src/node_device/node_device_udev.c (udevDeviceMonitorStartup):
Don't abort udev driver (and libvirtd overall) if non-root user
can't use pciaccess.

src/node_device/node_device_udev.c

index be6a37100af0253cb197d1e9046daae61840f183..44df16e6e064febddab986b55da8100a69668a41 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * node_device_udev.c: node device enumeration - libudev implementation
  *
- * Copyright (C) 2009-2010 Red Hat, Inc.
+ * Copyright (C) 2009-2011 Red Hat, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -1589,7 +1589,7 @@ out:
     return ret;
 }
 
-static int udevDeviceMonitorStartup(int privileged ATTRIBUTE_UNUSED)
+static int udevDeviceMonitorStartup(int privileged)
 {
     udevPrivate *priv = NULL;
     struct udev *udev = NULL;
@@ -1597,11 +1597,16 @@ static int udevDeviceMonitorStartup(int privileged ATTRIBUTE_UNUSED)
     int pciret;
 
     if ((pciret = pci_system_init()) != 0) {
-        char ebuf[256];
-        VIR_ERROR(_("Failed to initialize libpciaccess: %s"),
-                  virStrerror(pciret, ebuf, sizeof ebuf));
-        ret = -1;
-        goto out;
+        /* Ignore failure as non-root; udev is not as helpful in that
+         * situation, but a non-privileged user won't benefit much
+         * from udev in the first place.  */
+        if (privileged || errno != EACCES) {
+            char ebuf[256];
+            VIR_ERROR(_("Failed to initialize libpciaccess: %s"),
+                      virStrerror(pciret, ebuf, sizeof ebuf));
+            ret = -1;
+            goto out;
+        }
     }
 
     if (VIR_ALLOC(priv) < 0) {