]> xenbits.xensource.com Git - libvirt.git/commitdiff
Honor blacklist for modprobe command
authorJohn Ferlan <jferlan@redhat.com>
Fri, 24 Jan 2014 15:47:20 +0000 (10:47 -0500)
committerJohn Ferlan <jferlan@redhat.com>
Tue, 4 Feb 2014 15:43:53 +0000 (10:43 -0500)
https://bugzilla.redhat.com/show_bug.cgi?id=1045124

When loading modules, libvirt does not honor the modprobe blacklist.
Use the new virKModLoad() API in order to attempt load with blacklist check.
Use the new virKModIsBlacklisted() API to check if the failure to load
was due to the blacklist

Signed-off-by: John Ferlan <jferlan@redhat.com>
src/util/virpci.c

index e2d222e52b6adca2ce5f79b19f9eb787197808ed..c3d211f64b0295ceb279c6a423ce7dea31a36a3f 100644 (file)
@@ -42,6 +42,7 @@
 #include "vircommand.h"
 #include "virerror.h"
 #include "virfile.h"
+#include "virkmod.h"
 #include "virstring.h"
 #include "virutil.h"
 
@@ -990,18 +991,32 @@ recheck:
     VIR_FREE(drvpath);
 
     if (!probed) {
-        const char *const probecmd[] = { MODPROBE, driver, NULL };
+        char *errbuf = NULL;
         probed = true;
-        if (virRun(probecmd, NULL) < 0) {
-            char ebuf[1024];
-            VIR_WARN("failed to load driver %s: %s", driver,
-                     virStrerror(errno, ebuf, sizeof(ebuf)));
-            return -1;
+        if ((errbuf = virKModLoad(driver, true))) {
+            VIR_WARN("failed to load driver %s: %s", driver, errbuf);
+            VIR_FREE(errbuf);
+            goto cleanup;
         }
 
         goto recheck;
     }
 
+cleanup:
+    /* If we know failure was because of blacklist, let's report that;
+     * otherwise, report a more generic failure message
+     */
+    if (virKModIsBlacklisted(driver)) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("Failed to load PCI stub module %s: "
+                         "administratively prohibited"),
+                       driver);
+    } else {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("Failed to load PCI stub module %s"),
+                       driver);
+    }
+
     return -1;
 }
 
@@ -1312,12 +1327,8 @@ virPCIDeviceDetach(virPCIDevicePtr dev,
                    virPCIDeviceList *activeDevs,
                    virPCIDeviceList *inactiveDevs)
 {
-    if (virPCIProbeStubDriver(dev->stubDriver) < 0) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("Failed to load PCI stub module %s"),
-                       dev->stubDriver);
+    if (virPCIProbeStubDriver(dev->stubDriver) < 0)
         return -1;
-    }
 
     if (activeDevs && virPCIDeviceListFind(activeDevs, dev)) {
         virReportError(VIR_ERR_INTERNAL_ERROR,